对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢?
题目
对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢?
解析
普通的遍历是需要O(2n)时间,那有没有其他更好的办法呢?
其实可以使用分而治之的思想,将N分为两段 分别取到每一段中的最大和最小值 ,然后最大与最大比即可 最小与最小比即可,这样就可以避免最小与最大的比较
比如:
1,2,3,4
正常对比的话得到min=1,max=4需要6次
那如果先求的min1=1,max1=2,min2=3,max2=4(需要2次比较)
然后min1<min2 得到min=1,max1<max2可得max=4 (又是需要2次)
所以这种方法只需要4次
代码
1 | private static int compareCount=0; |
这种方式最终的复杂度是O(1.5n)
测试代码1
2
3
4
5
6
7
8public static void main(String[] args)
{
int[] a = {3, 2, 56, 109, 10, 95, 1, 230, -1000};
Data data=new Data();
maxMinInArray(a,0,a.length-1,data);
System.out.println(String.format("min:%s,max:%s",data.min,data.max));
System.out.println(String.format("length:%s,compare count:%s",a.length,compareCount));
}
min:-1000,max:3
length:9,compare count:13
参考
July微软面试100题
本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言。