最大連續子數組和最大、最小,絕對值最大、最小
阿新 • • 發佈:2017-09-01
面試
連續子數組最大和,可考慮
public class Solution { public int maxSubArray(int[] nums) { int len=nums.length; if(nums==null || len==0)return 0; int MAX=nums[0]; int curSum=nums[0]; for(int i=1;i<len;i++){ if(curSum>0){ curSum+=nums[i]; }else{ curSum=nums[i]; } MAX=Math.max(curSum,MAX); } return MAX; } }
連續子數組絕對值最大,可考慮
//求子數組的和的絕對值的最大值 //先計算所有sum[0-j] 0<= j <n,然後對sum[0-j]的數組進行排序,那麽對於任何i,j段的和等於:sum[i-j]= sum[0-j] - sum[0-i]; //設置數組sum用來存儲子數組0-j的和 //因為已經對sum進行了排序,排序後只需要找到sum[sum.size()-1]-sum[0],sum[z] (0<=z<sum.size())的絕對值的最大值即可。z為排序後的索引 //如果是sum[z]情形,z為排序後的索引,則maxAbs = abs(sum[0-i]) //如果是sum[sum.size()-1]-sum[0]情形,則maxAbs = abs(sum[i]-sum[j]) //時間復雜度:o(nlogn) 空間復雜度:o(n) public int maxAbsSum2(int[] num) { if(num.length()==0) return 0; if(num.length()==1) return Math.abs(num[0]); int max_abs_sum; int[] sum = new int[num.length()]; int cur_sum = 0; for(int i=0; i<num.length(); i++) { cur_sum += num[i]; if(cur_sum == 0) return 0; sum[i] = cur_sum; } Arrays.sort(sum); max_abs_sum = Math.abs(sum[sum.length()-1]-sum[0]); for(int i=0; i<sum.length(); i++) { cur_sum = Math.abs(sum[i]); if(cur_sum>max_abs_sum) max_abs_sum = cur_sum; } return max_abs_sum; }
最大連續子數組和最大、最小,絕對值最大、最小