[Lintcode]Maximum Subarray III最大子数组 III
2017-02-08 14:21
513 查看
Given an array of integers and a number k, find k
which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.
Example
Given
return
分析:与Best Time to Buy and Sell Stock IV类似,两个数组分别记录包含当前值的本地最优解和全局最优解。local[i][j]代表从0到nums中第i个数字处,分成j个数组后,和的最大值,且必须包括第i个数字,这样可以排除第i个数组包含在前一个数组中的情况。global[i][j]代表从0到nums第i个数字处,分成j个数组后和的最大值。
二维数组动态规划的状态转移方程为:
local[i][j] = Math.max(local[i - 1][j], global[i - 1][j - 1]) + nums[i - 1];
global[i][j] = Math.max(global[i - 1][j], local[i][j]);
public class Solution {
/**
* @param nums: A list of integers
* @param k: An integer denote to find k non-overlapping subarrays
* @return: An integer denote the sum of max k non-overlapping subarrays
*/
public int maxSubArray(int[] nums, int k) {
if(k > nums.length) return 0;
int[][] local = new int[nums.length + 1][k + 1];
int[][] global = new int[nums.length + 1][k + 1];
//if k=0 local/global colomn 0 = 0
//if nums.length=0 local/global row 0 = 0
for(int i = 1; i <= nums.length; i++) {
local[i][0] = Integer.MIN_VALUE;
for(int j = 1; j <= k; j++) {
if(j > i) {//矩阵中的值不能默认为0,否则影响结果
local[i][j] = Integer.MIN_VALUE;
global[i][j] = Integer.MIN_VALUE;
continue;
}
local[i][j] = Math.max(local[i - 1][j], global[i - 1][j - 1]) + nums[i - 1];
if(i == j)
global[i][j] = local[i][j];
else
global[i][j] = Math.max(global[i - 1][j], local[i][j]);
}
}
return global[nums.length][k];
}
}
non-overlappingsubarrays
which have the largest sum.
The number in each subarray should be contiguous.
Return the largest sum.
Example
Given
[-1,4,-2,3,-2,3],
k=2,
return
8
分析:与Best Time to Buy and Sell Stock IV类似,两个数组分别记录包含当前值的本地最优解和全局最优解。local[i][j]代表从0到nums中第i个数字处,分成j个数组后,和的最大值,且必须包括第i个数字,这样可以排除第i个数组包含在前一个数组中的情况。global[i][j]代表从0到nums第i个数字处,分成j个数组后和的最大值。
二维数组动态规划的状态转移方程为:
local[i][j] = Math.max(local[i - 1][j], global[i - 1][j - 1]) + nums[i - 1];
global[i][j] = Math.max(global[i - 1][j], local[i][j]);
public class Solution {
/**
* @param nums: A list of integers
* @param k: An integer denote to find k non-overlapping subarrays
* @return: An integer denote the sum of max k non-overlapping subarrays
*/
public int maxSubArray(int[] nums, int k) {
if(k > nums.length) return 0;
int[][] local = new int[nums.length + 1][k + 1];
int[][] global = new int[nums.length + 1][k + 1];
//if k=0 local/global colomn 0 = 0
//if nums.length=0 local/global row 0 = 0
for(int i = 1; i <= nums.length; i++) {
local[i][0] = Integer.MIN_VALUE;
for(int j = 1; j <= k; j++) {
if(j > i) {//矩阵中的值不能默认为0,否则影响结果
local[i][j] = Integer.MIN_VALUE;
global[i][j] = Integer.MIN_VALUE;
continue;
}
local[i][j] = Math.max(local[i - 1][j], global[i - 1][j - 1]) + nums[i - 1];
if(i == j)
global[i][j] = local[i][j];
else
global[i][j] = Math.max(global[i - 1][j], local[i][j]);
}
}
return global[nums.length][k];
}
}
相关文章推荐
- [Lintcode]Maximum Subarray II 最大子数组 II
- LeetCode:152_Maximum Product Subarray | 最大乘积连续子数组 | Medium
- LeetCode:152_Maximum Product Subarray | 最大乘积连续子数组 | Medium
- [LeetCode] Maximum Product Subarray 求最大子数组乘积
- 【LeetCode-面试算法经典-Java实现】【152-Maximum Product Subarray(子数组的最大乘积)】
- [LeetCode] Maximum Average Subarray I 子数组的最大平均值
- 求数组内子数组最大的和(Maximum Subarray )
- LeetCode-643:Maximum Average Subarray I (k个元素的最大子数组)
- Lintcode - Maximum Subarray III
- Maximum Product Subarray:数组中最大连续区间求积
- ***[Lintcode]Maximum Subarray Difference 最大子数组差
- LeetCode: -Dynamic Programming-Maximum Subarray[53]-子数组最大和
- 最大子数组和(The Maximum Subarray)
- Lintcode - Maximum Subarray III
- [leetcode 53] Maximum Subarray----最大子数组的和
- [Lintcode]Maximum Product Subarray乘积最大子序列
- lintcode---43. 最大子数组 III
- [LeetCode] Maximum Average Subarray II 子数组的最大平均值之二
- LintCode-最大子数组 III
- LeetCode-152:Maximum Product Subarray (乘积最大连续子数组) -- medium