给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
class Solution {
public int findKthLargest(int[] nums, int k) {
int target=nums.length-k;
int l=0,r=nums.length-1;
while(true) {
int index = partion(l, r, nums);
if (index == target) {
return nums[index];
}else if(index<target)l=index+1;
else r=index-1;
}
}//[3,2,1,4,5,6] 2
int partion(int l,int r,int[] nums)
{//走一轮快排,遇到小的交换,
int j=l,p=nums[l];
for (int i = l+1; i <=r ; i++) {
if(p>nums[i])
{
j++;
swap(nums, i, j);
}
}
swap(nums, l, j);//最后把确定temp的位置返回
return j;
}
void swap(int []nums,int x1,int x2)
{
int t=nums[x1];
nums[x1]=nums[x2];
nums[x2]=t;
}
}
这题没有限制时间复杂度,很明显直接sort(),再nums[n-k]就完事,时间复杂度nlogn,非常快,但想想,我觉得这题应该考的是一轮排序,在排序中,什么排序能在一轮位置确定该元素的最终位置,我的话想到两种,选择,快排。
1 、选择
如果找升序,那么就比n-k轮,最好是O(n),最坏是O(n^2)
2、快排
快排操作性就比较大,一轮排序最终确定位置的是temp,可以按二分的方式
把边界缩小,官方解也采用了二分后取随机值的方式让这种方法尽可能对付有序这种情况,所以最好是O(n)最坏应该是O(nlogn)