【算法】16个无序数最多20次比较找到第二大的数
来源:互联网 发布:淘宝店尾页区域怎么改 编辑:程序博客网 时间:2024/05/16 03:20
这个题是刚刚在微博上看到的,第一想法就想到了leetcode上关于注水的题,Trapping Rain Water,当时的解法是这样的:通过求第二大的数,来解决注水问题
class Solution {public: int trap(int A[], int n) { int left = 0; int right = n-1; int trap = 0; int secHigh = 0; while (left < right) { if(A[left] < A[right]) { secHigh = max(A[left], secHigh); trap += secHigh; left++; } else { secHigh = max(A[right], secHigh); trap += secHigh; right--; } } return trap; }};
看到代码也可以知道,一次判断left与right,一次判断max,这样每个数就有两次比较,而16个数也要30次比较,很明显不能满足要求。
后来看到某牛人的解法,叙述如下:
1、16个数分两组,每组8个,进行两两比较选择较大的,得到8个较大数的数组。这样有8次比较。
2、将8个数同样分两组,得到4个数,这样有4次比较。
3、在继续划分,则有2次比较,最后得到一次比较,这样共8+4+2+1=15次比较得到了最大数M。
4、第二大的数为与最大数进行过比较的数,一共有4个,在这4个数中找到最大的即为整个数组中第二大数S。这样有3此比较,则一共有15+3=18次比较。
关于第4步的解释如下:M最大,M比其他数都大,则M一定会剩下,如果S与M进行比较,则S属于与M比较的数组内,如果S与其他数比较,则S一定会剩下,那么S一定会与M进行比较,所以S一定存在于与M进行过比较的数组内。
举例如下:
数组{5, 3, 12, 14, 1, 8, 9, 13 , 4, 16, 10, 6, 7, 11, 2, 15}
第一次比较: 共8次比较
第一组:5, 3, 12, 14, 1, 8, 9, 13 ,
第二组:4,16, 10, 6, 7, 11, 2, 15
剩下:5,16,12,14, 7,11,9,15 共4次比较
同样比较剩下:7,16, 12,15 共2次比较
继续:12,16 共1次比较
最后得到:16
与16比较过的数为:12,15,11,3 共3次比较
其中最大的为15,所以数组中第二大数为15. 共比较18次。
- 【算法】16个无序数最多20次比较找到第二大的数
- 找到N个无序数中第M大的数
- 给定二维数组在m+1次比较次数内找到所查找的数所在位置
- 找到第二大的数
- 在无序数组中找到第k大的数
- 求无序数组中第二大的数--快速选择
- 关于求N个无序数中第K大的数。
- 只用2GB内存在20亿个整数中找到出现次数最多的数
- 只用2GB内存在20亿个整数中找到出现次数最多的数
- 只用2GB内在20亿个整数里中找到出现次数最多的数
- 查找算法——找到序列中第二大的数(修正版)
- 查找算法——找到序列中第二大的数
- 五个数如何只通过六次比较找出中位数
- 【滴滴笔试】利用快排找到一个无序的数组中的第K大的数
- 算法中对于用七次比较完成5个元素的排序
- 第二大的数
- 第二大的数
- 第二大的数
- C#结合GDAL实现规则影像裁剪
- Ext中中文乱码问题解决方法
- Mahout学习之Mahout算法分类
- Load Balance Tomcat with Nginx and Store Sessions in Redis
- 剑指offer--面试题4:替换空格--Java实现
- 【算法】16个无序数最多20次比较找到第二大的数
- 疯狂Java之学习笔记(4)---------------UML及面向对象
- Lazy<T>
- 微软校招2015 Beautiful String
- android intent
- 命令模式command
- x264参数介绍(二、分析和视频可用性信息)
- Jump Game
- Java之LinkedList详解