leetcode 1800. 最大升序子数组和

73 阅读2分钟

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

1. 题目与解析

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

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

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

输入: nums = [10,20,30,5,10,50]

输出: 65

解释: [5,10,50] 是元素和最大的升序子数组,最大元素和为 65 。

根据题意,我们可以得知,解题思路是利用一遍模拟记录所有生序子数组的和,之后对比取最大值。 因此,在解题的过程中,我们可以利用一个数字存储升序子数组相加的过程值,一个数字记录需要返回的答案值,进行遍历模拟求解。

2. 题解

class Solution {
    public int maxAscendingSum(int[] nums) {
        int ans = 0, tmp = 0, pre = 0;
        for (int num: nums) {
            if (num > pre) {
                tmp += num;
            } else {
                tmp = num;
            }
            ans = Math.max(ans, tmp);
            pre = num;
        }

        return ans;
    }
}

ans是记录模拟到目前为止的答案,tmp记录的是当前升序子数组相加到当前位置的过程值,在遍历求解的过程中,有两种情况,当前位置仍然在上一个升序子数组中或者当前位置进入的新的升序子数组,因此需要与前一位的数字比较大小。

if (num > pre) {
    tmp += num;
} else {
    tmp = num;
}

每一次比较过后,都需要比较当前tmp值与ans的大小:

ans = Math.max(ans, tmp);

另外,由于解题过程中使用了pre记录前一位的数值,因此每一步也需要记得更新pre的值 每一次比较过后,都需要比较当前tmp值与ans的大小:

pre = num;

总体来说,该题目bi jiao