[路飞]_每天刷leetcode_73(最大子数组和 Maximum Subarray)

「这是我参与2022首次更文挑战的第34天,活动详情查看:2022首次更文挑战

最大子数组和 Maximum Subarray

LeetCode传送门53. 最大子数组和

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

A subarray is a contiguous part of an array.

Example:

Input: nums = [-2,1,-3,4,-1,2,1,-5,4]
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

Input: nums = [1]
Output: 1

Input: nums = [5,4,-1,7,8]
Output: 23
复制代码

Constraints:

  • 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5
  • 1 0 4 < = n u m s [ i ] < = 1 0 4 -10^4 <= nums[i] <= 10^4

思考线


解题思路

我们要求解数组的最大子序和,我们可以思考,从前向后进行组合,什么样的组合是对结果有好处的呢?肯定是sum的结果大于0,再和当前值相加,会得到更好地结果,否则的话,我们要舍弃前面的一系列值的结果,以当前值nums[i]sum的值,进行累加操作。在整个过程中我们记录下sum的大小,最后当遍历完成时,我们只需要获取sum的最大的值即可。

先设sum = 0,然后我们从前向后遍历数组, 在第i步。

  • 如果 sum > 0,则说明 sum 对结果好处,则sum = sum + nums[i]

  • 如果 sum <= 0,则说明 sum 会让结果变小,我们直接舍弃前面的结果,sum = nums[i]

  • 每次比较 sumans的大小,将最大值置为ans,遍历结束返回结果

根据以上思考,我写出的代码如下:

function maxSubArray(nums: number[]): number {
    let max = -Infinity;
    let sum = 0;
    for (let i = 0; i < nums.length; i++) {
        sum = sum > 0 ? sum + nums[i] : nums[i]
        max = Math.max(max, sum)
    }
    return max;
};
复制代码

时间复杂度

O(n): n为数组的长度,由于我们需要遍历一次数组,所以时间复杂度为O(n).

这就是我对本题的解法,如果有疑问或者更好的解答方式,欢迎留言互动。

おすすめ

転載: juejin.im/post/7066723106261303303
おすすめ