算法 困难 | 43. 最大子数组 III

算法 困难 | 43. 最大子数组 III

题目描述

给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。

样例1

输入: 
List = [1,2,3]
k = 1
输出: 6
说明: 1 + 2 + 3 = 6

样例2

输入:
List = [-1,4,-2,3,-2,3]
k = 2
输出: 8
说明: 4 + (3 + -2 + 3) = 8

java题解

public class Solution {
    public int maxSubArray(int[] nums, int k) {
        if (nums.length < k) {
            return 0;
        }
        int len = nums.length;
        
       
        int[][] globalMax = new int[k + 1][len + 1];
        int[][] localMax = new int[k + 1][len + 1];
        
        for (int i = 1; i <= k; i++) {
            localMax[i][i-1] = Integer.MIN_VALUE;
            //小于 i 的数组不能够partition
            for (int j = i; j <= len; j++) {
                localMax[i][j] = Math.max(localMax[i][j-1], globalMax[i - 1][j-1]) + nums[j-1];
                if (j == i)
                    globalMax[i][j] = localMax[i][j];
                else
                    globalMax[i][j] = Math.max(globalMax[i][j-1], localMax[i][j]);
            }
        }
        return globalMax[k][len];
    }
    
}

C++题解

class Solution {
public:
    int maxSubArray(vector<int> nums, int k) {
    const int n = nums.size();
	vector<vector<int> > f(k + 1, vector<int>(n + 1));
	vector<vector<int> > p(k + 1, vector<int>(n + 1));
	int sum;
	for (int i = 1; i <= k; i++) {
		sum = INT_MIN;
		f[i][i] = f[i - 1][i - 1] + nums[i - 1];
		p[i][i] = f[i][i];
		sum = f[i][i];
		for (int j = i + 1; j <= n; j++) {
			if (f[i][j - 1] < p[i - 1][j - 1]) {
				f[i][j] = p[i - 1][j - 1] + nums[j - 1];
			}
			else {
				f[i][j] = f[i][j - 1] + nums[j - 1];
			}
			sum = max(sum, f[i][j]);
			p[i][j] = sum;
		}
	}
	int result = INT_MIN;
	for (int i = k; i <= n; i++) {
		result = max(result, f[k][i]);
	}
	return result;
    }
};

python题解

class Solution:
    def maxSubArray(self, nums, k):
        oo = 2 ** 32
        n = len(nums)
        f = [[-oo] * (k + 1), [-oo] * (k + 1)]
        g = [[-oo] * (k + 1), [-oo] * (k + 1)]
        
        f[0][0] = 0
        g[0][0] = 0
        for i in range(1, n + 1):
            f[i % 2][0] = 0
            g[i % 2][0] = 0
            for j in range(1, k + 1):
                f[i % 2][j] = max(f[(i - 1) % 2][j] + nums[i - 1],
                                  g[(i - 1) % 2][j - 1] + nums[i - 1])
                g[i % 2][j] = max(g[(i - 1) % 2][j], f[i % 2][j])
        return g[n % 2][k]
发布了201 篇原创文章 · 获赞 31 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43233085/article/details/104153261
今日推荐