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.println(min);
它能找到最小的数,但第二小的数没有任何意义
我该怎么做
请注意,我是Java的完全初学者,非常感谢您的简单解释和帮助。)
# 1 楼答案
这很简单:
# 2 楼答案
一般提示:您应该调用
Scanner
的close方法,最好在try-with-ressources
块中调用:这样,如果你打开一条流,你就应该关闭它
解决方案1:
使用现有代码的最简单方法是跟踪第二个最小的数字:
解释1:
使用新值时可能出现的两种情况是:
min
和sMin
。然后必须将min
的值设置为smin
,然后将min
设置为新的最小值李>min
,小于sMin
。然后只需将sMin
的值设置为新值李>解决方案2:
另一种更通用的方法是使用^{} :
这样,通过使用调用
poll()
方法的循环,可以得到给定的n
最小数。(n
可以是一个数字<;N
)解释2:
优先级队列是一种数据结构,它按照自然顺序对给定元素进行内部排序。对于整数,这个顺序由
<
、>
和=
给出。因此,当调用poll()
时,移除PriorityQueue
遇到的最小元素# 3 楼答案
这个问题可以通过多种方式解决,选择正确解决方案的第一步是决定什么对你最重要:
N
、a
、min
和secondMin
使用恒定的额外空间。“恒定空间”意味着存储的数据量不取决于要从流中读取的数字数量。相比之下,Tarlen使用线性空间,存储从流中读取的所有数字。这意味着所需的空间量与N
成正比,而不是常数李>N
个数字),时间效率最多是O(N logn)。这是我的代码: