繁体   English   中英

如何使用蛮力返回最大子数组?

[英]How to return the maximum subarray using brute force?

这是我使用蛮力返回最大子数组 SUM 的代码,但是是否可以返回实际的子数组呢?

public static int[] findMaximumSubArray(int[] nums){
    int curMax = nums[0];
    for(int i = 0; i < nums.length; i++) {
        int sum = nums[i];
        curMax = Math.max(sum,  curMax);
        
        for(int j = i + 1; j < nums.length; j++) {
            sum += nums[j];
            curMax = Math.max(sum,  curMax);
        }
    }
    return curMac;

除了跟踪当前最大和之外,您还应该跟踪当前最大子数组。 您只需跟踪其开始和结束位置即可轻松完成此操作。

// assume non-empty array
int maxStart = 0;
int maxEnd = 0;
int curMax = nums[0];

与其使用Math.max ,不如将其扩展为if (sum > curMax)检查,以便您还可以在其中设置maxStartmaxEnd

在外循环中,由于它找到了开始 position,因此将Math.max替换为:

if (sum > curMax) {
    curMax = sum;
    maxStart = i;
    maxEnd = i;
}

在内部循环中,因为它找到了开始 position 和结束 position,所以将Math.max调用替换为:

if (sum > curMax) {
    curMax = sum;
    maxStart = i;
    maxEnd = j;
}

最后,返回数组指定范围的副本:

return Arrays.copyOfRange(nums, maxStart, maxEnd + 1);

请注意,总和最大的子数组不是唯一的。 例如,数组{ 0, 1, 0 }有 4 个子数组,它们的总和为 1。该算法在最早开始的子数组中找到最短的。

完整代码如下所示:

public static int[] findMaximumSubArray(int[] nums) {
    int maxStart = 0;
    int maxEnd = 0;
    int curMax = nums[0];
    for (int i = 0; i < nums.length; i++) {
        int sum = nums[i];
        if (sum > curMax) {
            curMax = sum;
            maxStart = i;
            maxEnd = i;
        }

        for (int j = i + 1; j < nums.length; j++) {
            sum += nums[j];
            if (sum > curMax) {
                curMax = sum;
                maxStart = i;
                maxEnd = j;
            }
        }
    }
    return Arrays.copyOfRange(nums, maxStart, maxEnd + 1);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM