还是随机一道简单难度的题目,依旧是数组方面,这个题意很简单就是按顺序加数组,找出最大的那一段数组的和。
最开始判断思路有些问题,说一下最开始(平角裤平角裤)的四路:从不是零的数开始判断,找到小于零的数为止。
乍一看没什么问题,但是如果遇到【xx,-1,100】这种就会出问题,所以还要考虑到之后的情况。
换一个逻辑,那就是加上nums【i】之后比nums【i】本身还要小,这样就可以不如直接用nums【i】本身前面的和都没必要留着了。
代码如下:
public int maxSubArray(int[] nums) { int max=Integer.MIN_VALUE,tem=0; if(nums.length==1) return nums[0]; for(int i=0;i<nums.length;i++){ if(tem+nums[i]<=nums[i]){ tem=nums[i]; } else{ tem+=nums[i]; } if(tem>max){ max=tem; } } return max; }
题解中还有更加规整的答案:
public int maxSubArray(int[] nums) { int max=Integer.MIN_VALUE, i=0,sum=0; while (i<nums.length) { if (sum+nums[i]<nums[i]) { sum=0; } sum+=nums[i]; if (sum>max) { max=sum; } i++; } return max; }
对于给出的分而治之进阶,需要在算法学习更强之后再考虑编码实现,这里只看一看,想一想分治的思想:
每一个数据都有两个选择,与前面相连或者自己另立门户!
所以状态转移方程就是这个 dp[i] = Math.max(dp[i - 1] + nums[i],nums[i]);
class Solution { public int maxSubArray(int[] nums) { int len = nums.length; if(len == 0) return 0; if(len == 1) return nums[0]; int [] dp = new int[len]; int max = nums[0]; dp[0] = nums[0]; for(int i = 1;i < len;i ++){ dp[i] = Math.max(dp[i - 1] + nums[i],nums[i]); max = Math.max(max , dp[i]); } return max; } }