215. 数组中的第K个最大元素
题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
思路
采用快排的获取主元排序索引,更新到符合K大的位置
代码
代码1
class Solution {
public int findKthLargest(int[] nums, int k) {
if (nums == null || nums.length < k){
return -1;
}
int result = -1;
int start = 0;
int end = nums.length - 1;
result = getIndex(nums, start, end);
while (result != k - 1){
if (result > k - 1){
end = result;
result = getIndex(nums, start, end - 1);
} else if(result < k - 1){
start = result;
result = getIndex(nums, start + 1, end);
}
}
if (result == k - 1){
return nums[k - 1];
}else {
return -1;
}
}
private int getIndex(int[] nums, int s, int e){
int getNum = nums[s];
int getIndex = s;
swap(nums, s, e);
for(int i = s; i < e; i++){
if (nums[i] > getNum){
swap(nums, getIndex, i);
getIndex ++;
}
}
swap(nums, getIndex, e);
return getIndex;
}
private void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
// TODO:其他思路
复杂度分析
时间复杂度
平均$O(n)$,最坏$(n^2)$
空间复杂度
$O(1)$