您的位置:首页 > 其它

LeetCode Kth Largest Element in an Array

2015-10-29 01:07 357 查看
原题链接在这里:https://leetcode.com/problems/kth-largest-element-in-an-array/

采用quickSelect 算法,找第k大等于找第num.length + 1 - k小,这里k是从0开始所以就是 找num.length-k小。

findK就是找第k小函数,k从0开始。递归终止条件是 start>=end, 此时返回nums[start].

Time Complexity: O(n), Space O(1).

AC Java:

public class Solution {
public int findKthLargest(int[] nums, int k) {
//QuickSelect
return findK(nums, nums.length-k, 0, nums.length-1);
}
//findK 找第k小,k从0开始
private int findK(int[] nums, int k, int start, int end){
if(start >= end){
return nums[start];
}
int m = partition(nums, start, end);
if(m == k){
return nums[m];
}else if(m < k){
return findK(nums, k, m+1, end);
}else{
return findK(nums, k, start, m-1);
}
}

private int partition(int[] nums, int start, int end){
int pivot = nums[start];
int m = start;
int n = start + 1;
while(n<=end){
if(nums
< pivot){
//Here is ++m, not m++, it move m first and then swap
//e.g [3,2,1], pivot is 3, m = 0, n = 1.
//nums
< nums[m], swap nums[++m] and nums
, that is swap 2 with 2
swap(nums, ++m, n);
}
n++;
}
swap(nums,start,m);
return m;
}

private void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: