LeetCode 53. Maximum Subarray Java
题目:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
题意:查找一个数组的子数组,使得子数组的和最大。我最开始使用暴力求解,即分别对子数组只有1、2、3、...、n个元素的情况进行穷举,找出最大的值,但是意料之中,在最后几个测试用例中会超时。我们观察可以发现,从头遍历数组,对当前元素只有两种情况:
(1)如果当前元素加入之前的子数组大于能使子数组变大,则加入之前的子数组
(2)如果当前元素比之前子数组加现在的元素的和还要大,则自己重开一组
所以利用一个sum,记录遍历到当前元素时的最大子数组和,和全局数的max比较,最后得出最大子数组。
AC的代码:
public class Solution { public int maxSubArray(int[] nums) { int max=nums[0]; //记录最大值 int sum = nums[0]; for(int i=1;i<nums.length;i++){ sum=Math.max(nums[i], sum+nums[i]); //用来记录当前的最大值 max = Math.max(max, sum); } return max; } }
超时的代码:
public class Solution {
public int maxSubArray(int[] nums) {
int max=nums[0];
for(int i=1;i<=nums.length;i++){
for(int j=0;j<=nums.length-i;j++){
int temp=0;
for(int k=j;k<j+i;k++){
temp+=nums[k];
}
if(temp>max){
max=temp;
}
}
}
return max;
}
}