我试图找到长度至少为 k 的非连续子数组的最大和。
例如,一个 [1, 2, 3, 1, 7, 9] 数组,k = 2 应该返回 21 子数组 [2,3] 和 [7,9],它们是 2 个最大子数组并且是不连续的(彼此分开)在阵列中。
另一个例子是 [1, 2, 3, 4] k = 3 返回: 9, [2, 3, 4]
我在这里应用的方法给出了一个随机排序的整数数组,计算了 m 个大小为 k 的子数组,但通过计算一个假定数组来实现,这使得很难识别构成解决方案的各个数组值。正如本例中所做的那样。
可以更改此方法以显示构成总和的子数组吗?
以下是上述方法中描述的功能:
// reorganize array
public static int calcProfit(List<Integer> inputArray){
int lotCount = inputArray.get(0);
inputArray.remove(0);
int maxBusiness = inputArray.get(0);
inputArray.remove(0);
// convert arrayList to int array
int[] workingArray = new int[inputArray.size()];
for(int i = 0; i < inputArray.size(); i++) {
if (inputArray.get(i) != null) {
workingArray[i] = inputArray.get(i);
}
}
System.out.println(Arrays.toString(workingArray));
int prefixArray[] = new int[lotCount + 1 - maxBusiness];
int maxArrays = (int) Math.ceil(lotCount / maxBusiness);
arraySum(prefixArray, workingArray, lotCount, maxBusiness);
System.out.println("Prefix array is" + Arrays.toString(prefixArray));
int completeArray = maxSubarray(prefixArray, maxArrays, lotCount + 1 - maxBusiness, maxBusiness, 0);
return completeArray;
}
static void arraySum(int presum[], int arr[], int n, int k)
{
for (int i = 0; i < k; i++)
presum[0] += arr[i];
// store sum of array index i to i+k
// in presum array at index i of it.
for (int i = 1; i <= n - k; i++)
presum[i] += presum[i - 1] + arr[i + k - 1] -
arr[i - 1];
}
private static int maxSubarray(int preSum[], int m, int size, int k, int start) {
// stop if array length is 0
if (m == 0) {
return 0;
}
德玛西亚99
相关分类