数组中两个子数组最大和
在一个数组中找两个子数组,求其最大和(子数组不重合,不空)
算法:
- 设变量cur,max cur=max=arr[0]
- Cur<0 à cur=0 cur+=arr[i] max=Math.max
- 应用上面的,对arr从左遍历及从右遍历,得到L,R数组 L[i]/R[i]代表从左(右)开始到当前位置的子数组最大和
- 求最大的L[i]+R[i+1]
public int getFromTwoArray(int[] arr){ int[] L = new int[arr.length]; int[] R = new int[arr.length]; int max; L = this.getFromArray(arr); R = this.getFromArray(arr, "right"); max = L[0] + R[1]; for(int i=1;i<arr.length-1;i++){ max = Math.max(max, L[i]+R[i+1]); } return max; } public int[] getFromArray(int[] arr){ return this.getFromArray(arr, "left"); } public int[] getFromArray(int[] arr,String Role){ int[] maxArr = new int[arr.length]; int cur,max; if(arr.length<1){ throw new RuntimeException("null array"); } if(Role.equals("left")){ cur = arr[0]; max = cur; maxArr[0] = max; for(int i=1;i<arr.length;i++){ if(cur<0){ cur = 0; } cur += arr[i]; max = Math.max(cur, max); maxArr[i] = max; } return maxArr; }else if(Role.equals("right")){ cur = arr[arr.length-1]; max = cur; maxArr[arr.length-1] = max; for(int i=arr.length-2;i>=0;i--){ if(cur<0){ cur = 0; } cur += arr[i]; max = Math.max(cur, max); maxArr[i] = max; } return maxArr; }else{ throw new RuntimeException("error"); } }