1. 程式人生 > >動態規劃——Maximum Sum of 3 Non-Overlapping Subarrays

動態規劃——Maximum Sum of 3 Non-Overlapping Subarrays

使用 length 第一個 subarray n-2 [] 範圍 通過 兩個

這個題對我來說真的是相當難的題目了,嚴格來講可能不算是個動態規劃的題目,但這個題目對類似的劃分多個非重疊連續子區間的問題提供了一個很好解決方案

這個題目需要找三個非重疊的連續子區間,通過維護兩個數組將第一個和第三個子區間可能的開始pos記錄下來,在中間那個子區間開始的pos遍歷時限制其邊界範圍,根據長度能恰到好處的將三個子區間劃分成非重疊的,還使用了集合相減代替累加這樣比較簡單好用的技巧

下面提供代碼:

 1 class Solution {
 2     public int[] maxSumOfThreeSubarrays(int[] nums, int k) {
 3         int
len = nums.length; 4 int[]sum = new int[len+1]; 5 for(int i = 0;i<len;i++) 6 sum[i+1] = sum[i]+nums[i]; 7 int[]posLeft = new int[len]; 8 int[]posRight = new int[len]; 9 posLeft[k-1] = 0; 10 int total = sum[k]-sum[0]; 11 for
(int i = k;i<len;i++) { 12 if(total<sum[i+1]-sum[i+1-k]) { 13 total = sum[i+1]-sum[i+1-k]; 14 posLeft[i] = i-k+1; 15 }else posLeft[i] = posLeft[i-1]; 16 } 17 posRight[len-k] = len-k; 18 total = sum[len]-sum[len-k];
19 for(int i = len-k-1;i>=0;i--) { 20 if(total<sum[i+k]-sum[i]) { 21 total = sum[i+k]-sum[i]; 22 posRight[i]= i; 23 }else posRight[i] = posRight[i+1]; 24 } 25 int l = 0,r = 0,max = 0; 26 int[]arr = new int[3]; 27 for(int i = k;i<=len-2*k;i++) { 28 l = posLeft[i-1]; 29 r = posRight[i+k]; 30 total = (sum[l+k]-sum[l])+(sum[i+k]-sum[i])+(sum[r+k]-sum[r]); 31 if(total>max) { 32 arr[0] = l;arr[1] = i;arr[2] = r; 33 max = total; 34 } 35 } 36 return arr; 37 } 38 }

動態規劃——Maximum Sum of 3 Non-Overlapping Subarrays