【问题标题】:How can I return the 2 smallest elements in an array?如何返回数组中的 2 个最小元素?
【发布时间】:2022-11-27 23:40:48
【问题描述】:

我得到了一个 List<Integer>,我试图在一个新数组中返回列表中的 2 个最小整数。

为此,我创建了一个帮助器,用于查找数组中的最小数字,然后在我的主函数中使用它,我希望在其中使用一个运行到 2 的 while 循环,因为我需要 2 个最小的数字,并删除第一个(最小)数字,以便找到下一个最小的数字,然后将它们添加到我制作的新数组中。

这是我的代码:

public static int countSorthelper(List<Integer> arr) {
    int temp = 0;
    int n = 0;
    while(n <= 2){
   for (int x = 0; x < arr.size(); x++){
       for (int y = x+1; y < arr.size() && y <= x+y; y++){
           if(arr.get(y) > arr.get(x)){
               temp = arr.get(x);
               n++;
           }
       }
   }
   }
   return temp;

}
public static List<Integer> countSort(List<Integer> arr){
    int n = 0;
    List<Integer> j = new ArrayList<>();
    while (n <= 2){
        countSorthelper(arr);
        arr.remove(countSorthelper(arr));
        j.add(countSorthelper(arr));
        n++;
    }
    return j;
}

当我尝试运行它时,输出由于运行时间过多而终止,我需要对我的代码进行哪些更改??

【问题讨论】:

标签: java arraylist


【解决方案1】:

无需排序,因为您可以在线性时间内完成此操作。该代码应该是不言自明的,但基本上您需要对 min1min2 进行比较,并适当地交换它们的值。您可以在输出中看到这一点。

int min1 = Integer.MAX_VALUE;
int min2 = Integer.MAX_VALUE;
 
 List<Integer> list = List.of(1,10,2,5,10,-2,22,3,-1);
 for (int val : list) {
     if (val < min1) {
         min2 = min1;
         min1 = val;
         
     } else if (val < min2) {
         min2 = val;
     }
     System.out.printf("val = %2d : min1 = %2d,  min2 = %2d
",val, min1, min2); 
 }
 System.out.println(min1 + ", " + min2);

印刷

val =  1 : min1 =  1,  min2 = 2147483647
val = 10 : min1 =  1,  min2 = 10
val =  2 : min1 =  1,  min2 =  2
val =  5 : min1 =  1,  min2 =  2
val = 10 : min1 =  1,  min2 =  2
val = -2 : min1 = -2,  min2 =  1
val = 22 : min1 = -2,  min2 =  1
val =  3 : min1 = -2,  min2 =  1
val = -1 : min1 = -2,  min2 = -1
-2,  -1

【讨论】:

    猜你喜欢
    • 2020-04-20
    • 2012-11-13
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多