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;
就這麼簡單,就這幾行代碼,完事
之後查找大神代碼。發現就是這個思路
這道題終於解決完了。
感謝上蒼啊!!!!!!!!!!!