题目描述
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
做题思路
先通过找出数组中最后一个元素在数组中使是第几大值,然后在通过和k去比较
在这个期间将所有比 nums[r] 大的元素放在最左边,所有比nums[r]小的元素放在r的最右边 最后直接返回r的下标 就知道r在这个数组中是排列在第 几大 的位置 然后再通过和k去比较 再然后通过递归进一步的去判断就可以了
代码实现
class Solution {
public int findKthLargest(int[] nums, int k) {
if(nums.length < k) return -1;
return find(nums,0,nums.length-1,k);
}
public int find(int[] nums,int begin,int end,int k){
int p=find_end_sortLevel(nums,begin,end);
if((p-begin+1)==k)return nums[p];
else if((p-begin+1)>k){
return find(nums,begin,p-1,k);
}else{
return find(nums,p+1,end,k-(p-begin+1));
}
}
public int find_end_sortLevel(int[] nums,int begin,int end){
int i=begin-1;
int j=begin;
while(j<end){
if(nums[j] > nums[end]){
swap(nums,j,i+1);
i++;
}
j++;
}
swap(nums,end,i+1);
return i+1;
}
public void swap(int[] nums,int a,int b){
int c=nums[a];
nums[a]=nums[b];
nums[b]=c;
}
}