Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
挑选子串中最大的值,自己写了一堆代码最后缺少负数情况的考虑,
public class Solution { public int maxSubArray(int[] nums) { //第一次找一个数组 记录所有大于0的数字的位置 //结果=第一个非负数 //逐次循环加到下一个非负数,如果比当前结果大,则替换当前结果 int resMax=nums[0]; int res =nums[0] ; int len = nums.length; int vaNums[] = new int [len]; int j=0; // Map<Integer,Integer> map =new HaspMap<Integer,Integer>(); int m=0; int plusNums[] = new int [len]; for(int i=0;i<len;i++){ if(nums[i]>0){ vaNums[j]=i; // map.put(i,nums[i]); j++; } else{ plusNums[m]=i; m++; } res+=nums[i]; } if(j>0){ for(int k=0;k<j;k++){ res =0; for(int l =vaNums[k];l<=vaNums[j-1];l++){ res+=nums[l]; if(resMax<res){ resMax=res; } } } }//if j >0 end else { for(int k=0;k<m;k++){ res =nums[0]; for(int l =vaNums[k];l<plusNums[m-1];l++){ res+=nums[l]; if(resMax<res){ resMax=res; } } } } return resMax; } }
最佳办法,感觉是真滴牛逼
public class Solution { public int maxSubArray(int[] nums) { //第一次找一个数组 记录所有大于0的数字的位置 //结果=第一个非负数 //逐次循环加到下一个非负数,如果比当前结果大,则替换当前结果 int sum=0,max=Integer.MIN_VALUE; int len =nums.length; for(int i=0;i<len;i++){ sum +=nums[i]; max =Math.max(sum,max); sum = Math.max(0,sum); } //方法二 /* int sum=0,max=Integer.MIN_VALUE,minSum = 0; for (int i = 0; i < nums.length; i++) { sum += nums[i]; max = Math.max(max, sum - minSum); minSum = Math.min(minSum, sum); } */ return max; } }
时间: 2024-11-06 16:43:32