分治法求解最大连续子数组(字段和)问题的Java代码
时间: 2023-07-24 20:07:34 浏览: 100
以下是使用分治法求解最大连续子数组(字段和)问题的Java代码:
```java
public class MaximumSubarray {
public static int[] findMaximumSubarray(int[] nums) {
return findMaximumSubarray(nums, 0, nums.length - 1);
}
private static int[] findMaximumCrossingSubarray(int[] nums, int low, int mid, int high) {
int leftSum = Integer.MIN_VALUE;
int sum = 0;
int maxLeft = -1;
for (int i = mid; i >= low; i--) {
sum += nums[i];
if (sum > leftSum) {
leftSum = sum;
maxLeft = i;
}
}
int rightSum = Integer.MIN_VALUE;
sum = 0;
int maxRight = -1;
for (int j = mid + 1; j <= high; j++) {
sum += nums[j];
if (sum > rightSum) {
rightSum = sum;
maxRight = j;
}
}
return new int[]{maxLeft, maxRight, leftSum + rightSum};
}
private static int[] findMaximumSubarray(int[] nums, int low, int high) {
if (low == high) {
return new int[]{low, high, nums[low]};
} else {
int mid = (low + high) / 2;
int[] left = findMaximumSubarray(nums, low, mid);
int[] right = findMaximumSubarray(nums, mid + 1, high);
int[] cross = findMaximumCrossingSubarray(nums, low, mid, high);
if (left[2] >= right[2] && left[2] >= cross[2]) {
return left;
} else if (right[2] >= left[2] && right[2] >= cross[2]) {
return right;
} else {
return cross;
}
}
}
public static void main(String[] args) {
int[] nums = {1, -2, 3, 4, -5, 6, 7, -8, 9};
int[] result = findMaximumSubarray(nums);
System.out.println("Maximum subarray sum: " + result[2]);
System.out.println("Maximum subarray indices: [" + result[0] + ", " + result[1] + "]");
}
}
```
在这个示例中,我们定义了一个 `findMaximumSubarray()` 方法来找到给定数组的最大连续子数组。我们使用分治法来解决这个问题。我们首先将数组划分为两个子数组,然后分别找到左半部分、右半部分和跨越中心的最大子数组。最后,我们比较这三个结果,返回具有最大和的子数组。
我们还定义了一个 `findMaximumCrossingSubarray()` 方法来找到跨越中心的最大子数组。在这个方法中,我们首先找到左半部分的最大子数组,然后找到右半部分的最大子数组。通过将这两个子数组组合起来,我们可以找到跨越中心的最大子数组。
在 `main()` 方法中,我们创建了一个示例数组,并使用 `findMaximumSubarray()` 方法来找到最大子数组的和和索引。
阅读全文