[英]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)
检查,以便您还可以在其中设置maxStart
和maxEnd
:
在外循环中,由于它找到了开始 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.