Given an integer array nums and an integer k, return thekthlargest element in the array.
Note that it is the kth largest element in the sorted order, not the kth distinct element.
Example 1:
**Input:** nums = [3,2,1,5,6,4], k = 2
**Output:** 5
Example 2:
**Input:** nums = [3,2,3,1,2,4,5,5,6], k = 4
**Output:** 4
Constraints:
1 <= k <= nums.length <= 104
-104 <= nums[i] <= 104
ac1: quick select
Iterative version:
classSolution {publicintfindKthLargest(int[] nums,int k) {// Edge cases: invalid input. k--; // Kth largest, index = k - 1 in sorted array.int start =0, end =nums.length-1;while (start <= end) {int p =getArrayPartitionIndex(nums, start, end);if (p == k) return nums[p];if (p < k) { start = p +1; } elseif (p > k) { end = p -1; } }return-1; }privateintgetArrayPartitionIndex(int[] nums,int start,int end) {int pivot = nums[end];int left = start;for (int right = start; right < end; right++) {if (nums[right] >= pivot) {swap(nums, left, right); left++; } }swap(nums, left, end);return left; }privatevoidswap(int[] nums,int i,int j) {int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }}
Recursive versioned:
// quick select: set pivot, opposite direction two pointersclassSolution {publicintfindKthLargest(int[] nums,int k) {// sort, nlogn// partition, quick select// pivot, left/right// edge casesif (nums.length<1) return-1;returnquickSelect(nums,0,nums.length-1, k); }privateintquickSelect(int[] nums,int s,int e,int k) {// exitif (s == e) return nums[s];// initint l = s, r = e, pivot = nums[(s+e)/2];// loopwhile (l <= r) {while(l<=r && nums[l] > pivot) l++; // cannot put '==' here, will pass then entire list, cause stackoverflowwwhile (l <= r && nums[r] < pivot) r--;if (l <= r) {if (l < r) swap(nums, l, r); l++; r--; } }// determine which part contains kthif (s + k -1<= r) returnquickSelect(nums, s, r, k);if (s + k -1>= l) returnquickSelect(nums, l, e, k-(l-s)); // be careful set new value for k by k-(l-s)return nums[r+1]; // when there is value in the middle, right, kth, left }privatevoidswap(int[] nums,int i,int j) {int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; }}// Time: O(n)