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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章