我有一个包含数字的数组。
我在O(N)中得到了这个数组的两个最小值(可以是相同的数字),但我无法弄清楚如何得到这两个值的索引。
例如:在{1,2,3,1,5}中,答案将是索引0和索引3.这是我使用的代码:
public static void minMin(int arr[]){
int min1 = weights[0], min2 = weights[1];
if(min1 > min2){
int temp = min1;
min1 = min2;
min2 = temp;
}
for (int i = 2; i < weights.length; i++) {
if(weights[i] < min1){
int temp = min1;
min1 = weights[i];
min2 = temp;
}else if(weights[i] < min2){
min2 = weights[i];
}
}
}
答案 0 :(得分:5)
除了保持最小值的局部变量之外,您还需要索引的变量。
您使用0/1对它们进行初始化,并在更改其他变量时更新它们。
进一步考虑这个:另一个选项在没有更多变量的情况下工作。存储值+索引很方便(虽然评论是正确的,你可能会使用一个不同的类来做),但不是强制性的。因为当您拥有索引时,您总是可以获取值!
从这个意义上说:你可以改变你的代码来记住indixes。
答案 1 :(得分:1)
Ghostcat已经给出了答案,你只是不明白:
我只有一个索引,因为它的一个for循环,我需要两个元素的索引...
只需创建更多变量:
public static void main(String[] args) {
minMin(new int[] { 1, 2, 3, 1, 5 });
}
// Careful: this code only works for arr.lengh > 1
public static void minMin(int arr[]) {
int min1 = arr[0];
int min2 = arr[1];
int index1 = 0;
int index2 = 1;
if (min1 > min2) {
int temp = min1;
min1 = min2;
min2 = temp;
index1 = 1;
index2 = 0;
}
for (int i = 2; i < arr.length; i++) {
if (arr[i] < min1) {
int temp = min1;
min1 = arr[i];
min2 = temp;
index2 = index1;
index1 = i;
} else if (arr[i] < min2) {
min2 = arr[i];
index2 = i;
}
}
System.out.println("Smallest: " + min1 + ", index " + index1);
System.out.println("2nd smallest: " + min2 + ", index " + index2);
}
输出:
Smallest: 1, index 0
2nd smallest: 1, index 3