53. 最大子序和
难度简单1886
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
通过次数215,842
提交次数427,865
思路:
此题可以采用暴力法,但是效率很显然是o(n*n)。因此并不建议使用。既然题目要求最大子序列和,我们容易想到用贪心算法求解。
代码:
public static int maxSubArray2(int[] nums){
int res = nums[0];
int sum = 0;
//定义一个sum,用来计数当前选择的子数组累加和
for (int num : nums) {
if (sum>0){
sum+=num;
}else{
sum=num;
}
res=Math.max(res,sum);
}
return res;
}
此外,既然可以用贪心算法求解,我们也可以尝试一下动态规划dp,也可以求解此题。
扫描二维码关注公众号,回复:
11346747 查看本文章
思路:
我们先找到动态转移方程:
读题目我们可以写出如下动态转移方程
dp[i] = Math.max(dp[i-1],0)+nums[i];
代码:
public static int maxSubArray(int[] nums) {
int len = nums.length;
if (len==1){
return nums[0];
}
int [] dp=new int[len];
dp[0] = nums[0];
int max=nums[0];
for (int i = 1; i < len; i++) {
dp[i] = Math.max(dp[i-1],0)+nums[i];
if (dp[i]>max){
max = dp[i];
}
}
return max;
}
小结:博主建议大家要尝试自己动手推到一下dp方程,理解动态规划的思想,这两个算法是·经点算法,希望大家都可以掌握!