Lintcode :45. 最大子陣列差
阿新 • • 發佈:2018-11-04
描述
給定一個整數陣列,找出兩個不重疊的子陣列A和B,使兩個子陣列和的差的絕對值|SUM(A) - SUM(B)|最大。
返回這個最大的差值。
子陣列最少包含一個數
樣例
給出陣列[1, 2, -3, 1],返回 6
挑戰
時間複雜度為O(n),空間複雜度為O(n)
思路:與上一題最大子陣列II類似,只是要分情況找到sum(A)最大,sum(B)最小和sum(A)最小,sum(B)最大的情況
public int maxDiffSubArrays(int[] nums) { // write your code here int[] leftMax = new int[nums.length]; int[] leftMin = new int[nums.length]; int[] rightMin = new int[nums.length]; int[] rightMax = new int[nums.length]; int curSum = 0; int maxSum = nums[0]; int curDiff = 0; int minSum = nums[0]; for (int i = 0; i < nums.length; i++) { curSum += nums[i]; maxSum = Math.max(maxSum, curSum); curSum = Math.max(curSum, 0); leftMax[i] = maxSum; curDiff += nums[i]; minSum = Math.min(minSum, curDiff); curDiff = Math.min(curDiff, 0); leftMin[i] = minSum; } curSum = 0; curDiff = 0; maxSum = nums[nums.length - 1]; minSum = nums[nums.length - 1]; for (int i = nums.length - 1; i >= 0; i--) { curDiff += nums[i]; minSum = Math.min(minSum, curDiff); curDiff = Math.min(curDiff, 0); rightMin[i] = minSum; curSum += nums[i]; maxSum = Math.max(maxSum, curSum); curSum = Math.max(curSum, 0); rightMax[i] = maxSum; } int result = 0; for (int i = 0; i < nums.length - 1; i++) { result = Math.max(result, Math.abs(leftMax[i] - rightMin[i + 1])); result = Math.max(result, Math.abs(leftMin[i] - rightMax[i + 1])); } return result; }