【问题标题】:Find the index of two minimum values in array查找数组中两个最小值的索引
【发布时间】:2017-11-05 11:59:45
【问题描述】:

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

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

【问题讨论】:

  • 记录在案:我更新了我的答案;事情变得更简单了。但同样,我没有放弃代码,因为我不是来做你的作业的。我只是想帮你自己做。

标签: java arrays


【解决方案1】:

除了保持最小的局部变量之外,您还需要索引变量。

您使用 0/1 初始化它们,并在您更改其他变量时更新它们。

进一步思考:另一种选择在没有更多变量的情况下有效。存储值 + 索引很方便(尽管注释是正确的,您可能会使用不同的类来做到这一点)但不是强制性的。因为当你有一个 index 时,你总是可以获取 value

从这个意义上说:您可以更改代码以仅记住索引。

【讨论】:

  • 我只有一个索引,因为它是一个 for 循环,我需要两个元素的索引..
  • 不,ghostcat 是对的。您只需将值存储在变量中
  • 一如既往的简单高效:)
【解决方案2】:

鬼猫已经给出了答案,只是你没看懂:

我只有一个索引,因为它是一个 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

【讨论】:

  • 我个人会创建一个用于保存值和存储值的类,以使算法的逻辑与存储的逻辑清晰。它还有助于将任务分成两个更小、更容易的任务。但这只是我的看法。
  • 郑重声明:我不介意你收到了录取通知书,但是:不鼓励做所有部分的家庭作业问题。我试图给操作员一些提示,让他自己解决。你方便地为他解决了。所以你实际上剥夺了操作者进行重要学习步骤的机会:-)
猜你喜欢
  • 2017-08-13
  • 2016-03-17
  • 2015-12-15
  • 2021-08-26
  • 2011-05-08
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多