我正在做一个给定N个值数组的练习,我需要得到两个数字,它们的减法(最高 - 最低)是最正数。我希望v大于c ...情况是......假设我想以价格C购买拍卖,所以我可以以V价出售它们并获得最大利润,并且阵列的每个单元都是在第t天拍卖的价格,所以我想以尽可能低的价格购买,所以我可以以尽可能高的价格出售,所以C必须出现在阵列中的V之前。例如:
n = 8
arr = {6,7,3,8,9,2,1,4,20}
我想要c = 1
和v = 20
,因为20 - 1 = 19
(这意味着从这两个数字中减去最高)
另一个例子:
n = 6
arr = {8,12,45,40,18,29}
我想要c = 8
和v = 45
,因为它们的减法是所有其他减法中的最高数。 (我想澄清一下c并不总是数组中最小的数字)。两个数字不需要彼此相邻。如果我有n = 1, {1}
,那么c = 1
和v = 1
。
此示例演示c和v并不总是最低/最高值。
n = 6
arr = {19,27,5,6,7,8}
在这种情况下c = 19
和v = 27
另外,我需要使用合并排序的代码来解决这个问题(示例将它分为两种方法: mergesort 处理递归, merge 执行更改使用辅助阵列的位置。)
我正在使用mergesort代码(在我看来合并是不必要的,因为我不关心排序),到目前为止我有以下代码,但显然是错误的,有人可以告诉我我不做什么正确?
public static void mergeSort(int start, int end) {
if(start < end) {
int half = (start + end) / 2;
mergeSort(start, half);
for(int i = start; start < half; start++, i++){
if((arr[i+1] - arr[i]) > temp){
temp = arr[i+1] - arr[i];
c = i;
v = i+1;
}
}
mergeSort(half+1, end);
for(int i = half+1; i < end; half++, i++){
if((arr[i+1] - arr[i]) > temp){
temp = arr[i+1] - arr[i];
c = i;
v = i+1;
}
}
}
}
提前感谢您提供的任何帮助!
答案 0 :(得分:2)
我猜您代码中的名称mergeSort
是继承的....
由于您已经进行了递归,因此无需遍历所有元素,因为在递归之后,结果已经显示。例如,一种可能的方法是将最小值交换到第一个位置,将最大值交换到最后一个位置,然后,在“递增”的“上”级别,您可以直接检索它们。
这是另一种利用merge-sort理念的解决方案,但只有返回最大值
public class test {
static int arr [] = {6,7,3,8,9,2,1,4,20};
public static void main (String args[]) {
System.out.println(merge_select_max(0, arr.length - 1));
}
public static int merge_select_max (int start, int end) { // both inclusive
if (start == end) {
return arr[start];
}
else {
int half = (start + end) / 2;
int first = merge_select_max (start, half);
int second = merge_select_max (half + 1, end);
return (first > second ? first : second);
}
}
}