《leetCode》:Kth Largest Element in an Array
2016-04-09 19:43
330 查看
题目
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.For example,
Given [3,2,1,5,6,4] and k = 2, return 5.
Note:
You may assume k is always valid, 1 ≤ k ≤ array’s length.
思路一:利用排序
看到这个题目,一般想到的方法就是将数组进行排序,然后找出第k大的元素即可。但是,时间复杂度为O(n*logn)int cmp(const void* a,const void* b){ return (*((int *)a))-(*((int *)b)); } int findKthLargest(int* nums, int numsSize, int k) { if(nums==NULL||numsSize<1||k<0||k>numsSize){ return 0; } qsort(nums,numsSize,sizeof(nums[0]),cmp); return nums[numsSize-k]; }
思路二:不完全排序
思路一是全部将数组进行了排序然后选择出结果。其实,我们可以选择不完全排序来解决问题,在快排中,将数组分成两半,前面一半数组中的数全部小于 主元的值,后面一半数组中的数全部大于主元的值,如果主元的索引indexvoid swap(int *a,int *b){ int temp=*a; *a=*b; *b=temp; } int partition(int* nums, int start,int end){ if(end<start){ return -1; } int val=nums[start]; int index=start; for(int i=start+1;i<=end;i++){ if(nums[i]<val){ index++; swap(&nums[index],&nums[i]); } } swap(&nums[start],&nums[index]); return index; } void sortHelper(int* nums, int start,int end,int numsSize,int k){ if(end<=start){ return; } int index=partition(nums,start,end); if(index==numsSize-k){ return; } else if(index<numsSize-k){ sortHelper(nums,index+1,end,numsSize,k); } else if(index>numsSize-k){ sortHelper(nums,start,index-1,numsSize,k); } } int findKthLargest(int* nums, int numsSize, int k) { if(nums==NULL||numsSize<1||k<0||k>numsSize){ return 0; } int start=0; int end=numsSize-1; sortHelper(nums,start,end,numsSize,k); return nums[numsSize-k]; }
通过上面的理论分析,理论上第二种方法的运行时间会比第一种的运行时间少,出于好奇的看了下这两种方法的运行时间,如下:
第一种方法的运行时间:
第二种方法的运行时间:
从两张图中可以看出,居然是第一种的还要快。比较郁闷,居然和理论结果不一样。
郁闷的同时也开始找原因,开始以为是因为函数调用开销太大,导致第二种方法的运行时间过慢,因此,就把swap(int *a,int *b) 的功能全部用三行代码在函数partition中实现。居然,根本没有改善。呜呜。
相关文章推荐
- c++模板实现队列
- Collection集合层次结构图
- Whu oj 1606 - Funny Sheep
- leetcode 58. Length of Last Word
- 更新到Xcode 7.3 #import 不提示的问题
- 结对编程——电梯调度系统 的 感想与总结
- 软件工程_东师站_课堂笔记
- find之depth参数
- 认识 EXT2 文件系统、磁盘分区 ( Partition )、文件系统:
- LeetCode之13---Roman to Integer
- POJ 2987 Firing 最小割(最大权闭合子图)
- 分享最新版 nginx内置变量 大全
- mysql索引
- linux中库文件的生成和使用
- LeetCode之13---Roman to Integer
- 结对作业
- Linux安装模式下, 磁盘分区的选择(极重要)
- Shell脚本交互之:自动输入密码
- 调用系统拍照和在系统图库选择照片设置头像
- Deep learning tutorial