Max Subarray思路解析及源代碼

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;

就這麼簡單,就這幾行代碼,完事

之後查找大神代碼。發現就是這個思路

這道題終於解決完了。

感謝上蒼啊!!!!!!!!!!!









發佈了36 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章