【算法】最大升序子数组和

98 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

题目

给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。

子数组是数组中的一个连续数字序列。

已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。

解题思路

数组中递增数组是一段段,因此可以先累加当前递增数组和并记录下来。等到遍历数组时数值比前面的小说明是分段递增数组了。重新开始求分段递增数组和并和当前记录的最大和比较得出最大值。

普通解法

  1. 特殊情况判断,数组个数判断
  2. 当前最大值max和目前比较后的最大和resultMax
  3. 遍历所有数值,是否是一个递增数组判断的依据下一个值是否大于上一个值
  4. 若不再是一个数组做最大值判断得到当前最大和resultMax
    public int maxAscendingSum(int[] nums) {
            if(nums.length == 1) return  nums[0]; // 数组长度不够特殊情况处理
            int max = nums[0]; // 计算中递增排序最大值
            int resultMax = nums[0]; // 目前数组中求得最大值
            for(int i = 1; i < nums.length;i++){ // 循环数组
                if(nums[i] > nums[i - 1]){ // 判断下一个值是否大于前一个值
                    max += nums[i];
                }else{
                    resultMax = Math.max(resultMax,max); // 不大于前一个值就需要判断下是否是最大和
                    max = nums[i]; // 记录下最大和
                }
            }
            // 递增排序最大值最后一次求最大
            resultMax = Math.max(resultMax,max);
            return resultMax;
    }

简化解法

优化解法主要是将最大值比较放在每次循环当中,在循环过程可能就存在循环到当前值比之前和要大的情况,和普通解法相比无需在循环结束之后再做一次比较操作。虽然每次循环都做比较但代码可读性会有所提高。

 public int maxAscendingSum(int[] nums) {
     int n = nums.length, ans = nums[0];
     for (int i = 1, cur = nums[0]; i < n; i++) {
         if (nums[i] > nums[i - 1]){
             cur += nums[i];
         }else{
             cur = nums[i]; 
         } 
         ans = Math.max(ans, cur); // 每次循环都求最大值
     }
     return ans;
 }

参考