leetcode-53:最大子序和

简介: leetcode-53:最大子序和

题目

题目链接

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

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

示例 5:

输入:nums = [-100000]
输出:-100000

解题

方法一:暴力(会超时)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res=INT32_MIN;
        int tmp=0;
        for(int i=0;i<nums.size();i++){
            tmp=0;
            for(int j=i;j<nums.size();j++){
                tmp+=nums[j];
                res=tmp>res?tmp:res;
            }
        }
        return res;
    }
};

方法二:贪心

遍历nums,从头开始用tmp累积,如果tmp一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积tmp了,因为已经变为负数的tmp,只会拖累总和

参考链接

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res=INT_MIN;
        int tmp=0;
        for(int i=0;i<nums.size();i++){
            tmp+=nums[i];
            res=max(tmp,res); // 取区间累计的最大值(相当于不断确定最大子序终止位置)
            if(tmp<=0) tmp=0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
        }
        return res;
    }
};

方法三:动态规划

参考链接

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int pre=0;
        int res=nums[0];
        for(int num:nums){
            pre=max(pre+num,num); //状态转移方程
            res=max(res,pre); //更新最大值
        }
        return res;
    }
};

java

class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length==1) return nums[0];
        int pre=0;
        int res=nums[0];
        for(int i=0;i<nums.length;i++){
            pre=Math.max(pre+nums[i],nums[i]);
            res=Math.max(res,pre);
        }
        return res;
    }
}


相关文章
|
1月前
【LeetCode 17】5.7四数之和
【LeetCode 17】5.7四数之和
30 1
|
3月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
|
1月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
51 0
|
6月前
[leetcode] 四数之和 M
[leetcode] 四数之和 M
|
6月前
leetcode-343:整数拆分
leetcode-343:整数拆分
42 0
|
算法 安全 Swift
LeetCode - #18 四数之和
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
leetcode:18.四数之和
这题和前面的一道三数之和类似,解题的思路都一样,这里直接选取两个基准就可以了,然后循环出所有的组合进行判断,如果正好相等那么就加入Set集合中。
60 0
|
算法
leetcode 53 最大子数组和
leetcode 53 最大子数组和
56 0
leetcode 53 最大子数组和