53.最大子序列和

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解-贪心

贪心贪的是开头值的和,假设当前数为x,开头正数+x肯定大于开头负数+x,所以如-2和1肯定选1开头。
对于当前元素nums[i]来说,因为是连续的子数组,要么是nums[i]加入之前的数组,要么是从nums[i]开始新开一个数组。nums[i]之前的数组和如果是负数,负数+nums[i]必然会小于nums[i],所以开头如果是负数会拉低总和,可以舍去。

class Solution {
    public int maxSubArray(int[] nums) {
    int sum = 0;
    int max =nums[0];
    for(int num:nums){
        if(sum>0)sum+=num;
        else sum=num;
        max = Math.max(sum,max);
    }
     return max;
    }
}

题解-动态规划

动态规划适用于

  • 多阶段决策
  • 不问具体解,只求最优解

这道题的最优解就是最大和。

dp数组及其下标的含义
问题从数组中找到一个具有最大和的连续子数组 --> 子问题下标i及i以前数组中找到一个具有最大和的连续子数组

dp[i] 表示nums[i]结尾的连续子数组最大和为dp[i]

dp数组的递推式

如果当前nums[i]不加入数组,dp[i]=nums[i],从头开始计算连续子数组和
如果当前的nums[i]加入数组,dp[i]=dp[i-1]+nums[i]

dp[i] = Math.max(nums[i],dp[i-1]+nums[i])

dp数组初始化
dp[0]=nums[0]

遍历顺序
dp[i] = Math.max(nums[i],dp[i-1]+nums[i]) dp[i]依赖于dp[i-1]

dp[i]只与dp[i-1]有关,所以可以使用变量来代替

int cur=nums[0]; 
int result=nums[0];
for(int i=1;i<nums.length;i++){
	cur = Math.max(num,cur +num);
	if(cur>result)result=cur;
}
return result;

代码

class Solution {
    public int maxSubArray(int[] nums) {
int cur=nums[0]; 
int result=nums[0];
for(int i=1;i<nums.length;i++){
	cur = Math.max(num,cur +num);
	if(cur>result)result=cur;
}
return result;
}
}
posted @ 2021-07-05 17:09  rananie  阅读(49)  评论(0编辑  收藏  举报