Java 一组中最小的两个数

Java 一组中最小的两个数,java,Java,我试图在不使用数组的情况下找到集合中的两个最小数字。代码如下: Scanner in = new Scanner(System.in); int N = in.nextInt(); int min = in.nextInt(); for(int i = 1; i < N; i++){ int a = in.nextInt(); if(a < min){ min = a; } } System.out.print

我试图在不使用数组的情况下找到集合中的两个最小数字。代码如下:

Scanner in = new Scanner(System.in);

int N = in.nextInt();
int min = in.nextInt();


for(int i = 1; i < N; i++){
    int a = in.nextInt();

    if(a < min){            
        min = a;
    }
}

System.out.println(min);
Scanner-in=新的扫描仪(System.in);
int N=in.nextInt();
int min=in.nextInt();
对于(int i=1;i
它能找到最小的数,但第二小的数却没有

我该怎么做

请注意,我是Java的完全初学者,非常感谢您的简单解释和帮助)

非常简单:

Scanner in= new Scanner(System.in);

    int N = in.nextInt();
    int min,min2 = Integer.MAX_VALUE,Integer.MAX_VALUE;


    for(int i = 0; i < N; i++){

        int a = in.nextInt();

        if( a < min){

            min = a;
            min2 = min;
        }
        else if( a < min2){

            min2 = a;
        }

    }


    System.out.println(min);
    System.out.println(min2);
Scanner-in=新的扫描仪(System.in);
int N=in.nextInt();
int min,min2=Integer.MAX\u值,Integer.MAX\u值;
对于(int i=0;i
这是您必须添加的一个条件:

Scanner in = new Scanner(System.in);

int N = in.nextInt();
int min = Integer.MAX_VALUE;
int secondMin = Integer.MAX_VALUE;

for(int i = 0; i < N; i++){
    int a = in.nextInt();

    if(a < min){
        secondMin = min; // the current minimum must be the second smallest
        min = a; // allocates the new minimum
    }

    else if (a < secondMin) {
        secondMin = a; // if we did not get a new minimum, it may still be the second smallest number
    }
}

System.out.println(min);
System.out.println(secondMin);
Scanner-in=新的扫描仪(System.in);
int N=in.nextInt();
int min=整数最大值;
int secondMin=Integer.MAX\u值;
对于(int i=0;i
一般提示:您应该调用
扫描仪的close方法,最好在
try with resources
块中调用:

try(Scanner in = new Scanner(System.in)) {
    // other code here
}
这样,流就会关闭,如果打开流,您应该这样做

解决方案1: 使用现有代码的最简单方法是跟踪第二个最小的数字:

Scanner in = new Scanner(System.in);

int N = in.nextInt();
int min = in.nextInt();
int sMin = Integer.MAX_VALUE;

for(int i = 1; i < N; i++){
    int a = in.nextInt();

    if(a < min){
        sMin = min;
        min = a;
    } else if(a < sMin) {
        sMin = a;
    }
}

System.out.println(min);
System.out.println(sMin);
这样,您就可以通过调用
poll()
方法的循环来获得给定的
n
最小数字。(
n
可以是一个数字


解释2: 优先级队列是一种数据结构,它按照自然顺序对给定元素进行内部排序。对于整数,该顺序由
=
给出。因此,当调用
poll()
时,您将删除
PriorityQueue
遇到的最小元素。

尝试以下操作:

Scanner in = new Scanner(System.in);

int n = in.nextInt();
int min2 = in.nextInt();
int min1 = min2;

for(int i = 1; i < n; i++){
    int a = in.nextInt();

    if( a < min2){
        if(a < min1){
            min2 = min1;
            min1 = a;
        }
        else{
            min2 = a;
        }
    }
}

System.out.println(min1 + " " + min2);
Scanner-in=新的扫描仪(System.in);
int n=in.nextInt();
int min2=in.nextInt();
int min1=min2;
对于(int i=1;i
这个问题可以用多种方法解决,选择正确解决方案的第一步是决定什么对你最重要:

  • 空间效率,即使用尽可能少的存储量。ThreeFx这样做,(s)他只为变量
    N
    a
    min
    secondMin
    使用恒定的额外空间。“常量空间”表示存储的数据量不取决于要从流中读取的数字数量。相比之下,Tarlen使用线性空间,存储从流中读取的所有数字。这意味着所需的空间量与
    N
    成正比,而不是常数
  • 时间效率,即执行尽可能少的计算。从这个角度来看,我相信ThreeFx的解决方案是最有效的。Tarlen的解决方案会慢一点,因为管理优先级队列可能需要更多的比较
  • 可扩展性,即当需求发生轻微变化时,调整代码的容易程度。假设你的老板让你解决你刚刚发布的问题,找到两个最小的数字。第二天,他想要前三个,以此类推,直到周末。你厌倦了每天修改你的代码,所以你写了一个通用的解决方案,它可以处理他要求的任何数量的元素。这就是塔伦的解决方案更好的地方
  • 可读性,即代码的简短易懂程度。我将在这里介绍我自己的解决方案,它基于一个简单的想法:将所有数字放在一个列表中,排序,然后取出前两个数字。请注意,对于资源来说,这是相当浪费的:空间是线性的(我存储的是
    N
    数字),时间效率最多是O(N logn)。这是我的密码:
  • List List=new ArrayList();
    for(inti=0;i
    做同样的事情,但同时也要跟踪你所做的事情。这就是问题所在)怎么做@Olicharlessworth有些人已经在修改格式了^^^是的,我也考虑过了,但它并不完美:在集合[5,4,1,2,3]中,第二分钟将是4,因为它是之前的最小值)@JohnyStark是的,我的错,我会马上纠正它!编辑它是正确的,先生@那是你旧代码的一个bug。。。循环从值
    1
    @JohnyStark开始(没问题:我是Java的绝对初学者)所以我不太理解你的代码)你能帮我找到第一种方法吗:同时跟踪第二个最小的数字??如果他甚至不能使用数组,他可能不能使用优先级队列。是的,没错。我忽略了那条线。编辑传入。这并不是说我不能…我不被允许)@JohnyStark请给出一个不允许的例子work@ThreeFx,它不允许我输入最后一个数字。例如,当我输入5,然后尝试输入[5,4,3,2,1]集时,在2之后它将给我t
    Scanner in = new Scanner(System.in);
    
    int n = in.nextInt();
    int min2 = in.nextInt();
    int min1 = min2;
    
    for(int i = 1; i < n; i++){
        int a = in.nextInt();
    
        if( a < min2){
            if(a < min1){
                min2 = min1;
                min1 = a;
            }
            else{
                min2 = a;
            }
        }
    }
    
    System.out.println(min1 + " " + min2);