问题描述
从给定长度的整数数组中,选取第K大的数字。要求时间复杂度为O(N).
解决方法
1)需要查找的数组a,选取其中一个数字ai作为Key
2) 小于Key的数字放在Key左侧
3)大于等于Key的数字放在Key右侧
4)如果Key的下标keyIndex等于K,返回Key;
5)如果keyIndex 小于K,end = keyIndex - 1,重复1)
6)如果keyIndex 大于K,start = keyIndex + 1,重复1)
这种求解方法是快速排序的思路演化而来。
个人想到的一个将元素依据大小放置在Key左右的方法。
使用两个辅助数组,一个保存大于Key的元素,一个保存小于Key的元素。将小于Key的元素放置在头部,将小于Key的元素放于尾部。将剩余的空间放置Key。
优点:可以得到于Key相同的所有元素,对于相同元素多的数组可以加快速度
缺点:耗时,需要辅助空间
衍生问题
- 给定整数数组中,求前K大的所有数字
- 给定整数数组中,某个的数字出现次数超过数组长度一半,找到这个数字。
源码解析
1 |
|