Java 在数组中查找最小值和最大值的有效方法
我想找出整数数组中的最小值和最大值 以下哪种方法更有效Java 在数组中查找最小值和最大值的有效方法,java,arrays,sorting,max,min,Java,Arrays,Sorting,Max,Min,我想找出整数数组中的最小值和最大值 以下哪种方法更有效 对数组排序,然后查看开始和结束以获得最小值和最大值 使用Arrays.asList()将数组转换为列表,然后使用Collections.min()方法 我想使用的代码如下所示: // Find missing number from an array of consecutive numbers arranged randomly import java.util.Arrays; public class MissingNumber {
Arrays.asList()
将数组转换为列表,然后使用Collections.min()
方法// Find missing number from an array of consecutive numbers arranged randomly
import java.util.Arrays;
public class MissingNumber {
public static void main(String[] args) {
int[] consecutiveRandomNos = { 3, 6, 5 };
System.out.println(addNumbers(consecutiveRandomNos));
System.out.println("The missing number is "
+ (returnSum(consecutiveRandomNos) - addNumbers(consecutiveRandomNos)));
}
public static int addNumbers(int... numbers) {
int result = 0;
for (int number : numbers) {
result += number;
}
return result;
}
public static int returnSum(int... nos) {
Arrays.sort(nos);
int max = nos[nos.length - 1];
int min = nos[0];
int total = 0;
for (int i = min; i <= max; i++) {
total += i;
}
return total;
}
}
//从随机排列的连续数字数组中查找缺少的数字
导入java.util.array;
公共类丢失号{
公共静态void main(字符串[]args){
int[]连续的ANDOMNOS={3,6,5};
System.out.println(addNumbers(concertiverandomnos));
System.out.println(“缺少的号码是”
+(returnSum(consutiverandomnos)-addNumbers(consutiverandomnos));
}
公共静态int addNumbers(int…numbers){
int结果=0;
用于(整数:数字){
结果+=数字;
}
返回结果;
}
公共静态整数返回和(整数…个){
数组。排序(个);
int max=个数[个数长度-1];
int min=数量[0];
int-total=0;
对于(int i=min;i源代码:
585 public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {
586 Iterator<? extends T> i = coll.iterator();
587 T candidate = i.next();
588
589 while (i.hasNext()) {
590 T next = i.next();
591 if (next.compareTo(candidate) < 0)
592 candidate = next;
593 }
594 return candidate;
595 }
585公共静态排序成本O(NlogN),通过数组查找最小和最大成本O(N)。
无需转换为列表,只需对数组进行排列。排序最多为O(Nlog(N))。
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i=0; i<array.length; i++)
{
if(array[i] < min)
min = array[i]
if(array[i] > max)
max = array[i]
}
只要迭代数组,就可以在O(n)中找到极小值和极大值
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(int i=0; i<array.length; i++)
{
if(array[i] < min)
min = array[i]
if(array[i] > max)
max = array[i]
}
int max=Integer.MIN\u值;
int min=整数最大值;
for(int i=0;i)可以在O(1)中帮助您。事实上,您可以使用单个for循环解决整个问题:
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int sum = 0;
for(int i=0; i<array.length; i++)
{
if(array[i] < min)
min = array[i];
if(array[i] > max)
max = array[i];
sum += array[i];
}
return (max - min + 1)(max + min)/2 - sum;
int max=Integer.MIN\u值;
int min=整数最大值;
整数和=0;
对于(int i=0;i max)
max=数组[i];
总和+=数组[i];
}
返回(最大-最小+1)(最大+最小)/2-和;
先写一些代码可能是第2点:谢谢你的快速回复。我在想哪种方式更好。我应该先发布代码。“如果你的排序算法是O(n)”也许不是,或者D@Trinimon视情况而定,OP可能是Chuck Norris。@Trinimon通常情况下,它不能具有这种复杂性,但取决于对数据的约束,它可以。例如,如果要在[0;100]中对数字数组进行排序,可以在O(n)中进行排序@Arnauddenoylle这是最好的情况。。但请注意,即使数据已排序,也有一些算法不能有O(n)。@Arnaud denoylle:我知道,有些算法对于已排序的列表只需要O(n)。但是,我假设分布相等,因为在这方面没有特别说明。只有Chuck Norris需要始终有O(n):D(p.s.检查)注意,这与其他答案相同,但在一个过程中同时找到max和min。stackoverflow的地狱人速度很快!集合内的迭代#min基本上做了相同的事情(使用迭代器),因此这些答案基本上是同样有效的。结果表明,3个答案基本上是在30秒内提交的(我没有看到它们),因此它们可能看起来重复。如果可以保存一个评估,而不是使用两个ifs,则使用一个else。您也不必担心边缘大小写数组[I]==max
因为效果是一样的。它很简单,但可以加上upMmm,如果你是这个意思,我可以使用“else-if”。我不能完全删除第二个if,因为我看到的大多数新项可能都是