在数组中查找两个最小值的索引

时间:2017-06-04 17:00:08

标签: java arrays

我有一个包含数字的数组。

我在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];
       }
      }
}

2 个答案:

答案 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