if(nums.length==0)
return 0;
int max=Integer.MIN_VALUE;
int maxnow=max;
for(int i=0;i<nums.length;i++){
maxnow=nums[i];
for(int j=i+1;j<nums.length;j++){
if(maxnow<maxnow+nums[j])
maxnow+=nums[j];
else if(maxnow>max){
max=maxnow;
break;
}
}
}
return max;
题目的目的是在数列中找到和最大的子数列想到的思路是维护两个指针
指针i从0到n
指针j从i+1到n
用max存储最大值
从第i项开始寻找
用maxnow存储现在的最大值,只有要一旦这个值减小就停止继续搜索,和max进行比较
在操作的时候发现这个思路是错误的,因为有的正确结果在中间过程中,和是会减小的。
查看提示:dynamic and programming以及divide and conquer
意识到需要采取分治策略
先将问题一分为二,再将子问题一分为二。最后分为每组的元素个数<=2个,再进行解决,然后将两个子数组看成两个子元素再找最大值,不断向上返回,直到到达树的根部。解决问题。
public int maxSubArray(int[] nums) {
if(nums.length==0)
int max=nums[0];
int maxnow=max;
for(int i=1;i<nums.length;i++){
maxnow=Math.max(maxnow+nums[i], nums[i]);
max=Math.max(maxnow, max);
}
return max;
return 0; if(nums.length==1) return nums[0]; if(nums.length==2) return Math.max(Math.max(nums[0], nums[1]), nums[0]+nums[1]); int[] left=new int[nums.length/2]; System.arraycopy(nums, 0, left, 0, nums.length/2); int[] right=new int[nums.length/2]; System.arraycopy(nums, nums.length/2, right, 0, nums.length/2); int max_left=maxSubArray(left); int max_right=maxSubArray(right); return Math.max(Math.max(max_left, max_right), max_left+max_right); }
但是结果还是错的。并且比正确结果大很多。这我就很奇怪了,为啥。
后来跑了一遍程序,意识我得到的以为 的这个正确很可能不是相邻的数组元素得来的,所以虽然得到了很大的值,但却不是正确的。
之后思路就变得很混乱,很混乱,非常混乱
让自己安静了一下,然后回到了问题本身,发现自己是把问题变复杂了。
值需要将第一种方法改变一下就可以。比较的不是是否减少,而是当前的和和现在面对的元素,到底是谁大一点。
代码如下:
int max=nums[0];
int maxnow=max;
for(int i=1;i<nums.length;i++){
maxnow=Math.max(maxnow+nums[i], nums[i]);
max=Math.max(maxnow, max);
}
return max;
就这么简单,就这几行代码,完事
之后查找大神代码。发现就是这个思路
这道题终于解决完了。
感谢上苍啊!!!!!!!!!!!