leetcode KthlargestNumber
z
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class KthlargestNumber {
/**
* 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.
*
* Example 1:
*
* Input: [3,2,1,5,6,4] and k = 2
* Output: 5
* Example 2:
*
* Input: [3,2,3,1,2,4,5,5,6] and k = 4
* Output: 4
* Note:
* You may assume k is always valid, 1 ≤ k ≤ array's length.
*/
public static int findKthLargest(int[] nums, int k) {
int left = 0;
int right = nums.length-1;
while(true){
if (left == right){
return nums[right];
}
int pivotIndex = left + (right - left)/2;
pivotIndex = partition(nums, left, right, pivotIndex);
if (pivotIndex == k ){
return nums[pivotIndex];
}
else if (pivotIndex > k){
right = pivotIndex - 1;
}
else
left = pivotIndex + 1;

}
}

public static int partition(int[] nums, int left, int right, int pivotIndex){
int index = left;
int pivotValue = nums[pivotIndex];
swap(nums, right, pivotIndex);
for (int i=left; i< right; i++){
if (nums[i] > pivotValue){
swap(nums, i, index);
}
index ++;
}
swap(nums, index, right);
return index;
}

// swap two values.
public static void swap(int[] nums, int left, int right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
public static void main(String[] args){

}
}