# 1985. Find the Kth Largest Integer in the Array ###### tags: `Leetcode` `Medium` `QuickSort` `FaceBook` `Priority Queue` Link: https://leetcode.com/problems/find-the-kth-largest-integer-in-the-array/ ## 思路 和其他用quicksort或者priority queue找第k大的值很像,但时间复杂度有差别,建议直接把quicksort的代码背下来,不然总是写错555 ### 思路一 Priority Queue O(NlogK * M) O(K) Time: O(NlogK * M), where N <= 10^4 is length of nums array, K <= N is the kth largest element need to output, M <= 100 is length of each num. Explain: The MinHeap keeps up to K elements, **each heappush/heappop operator costs O(logK)**. We iterate all elements in nums and push/pop to the MinHeap N times. **We need to multiply by M as well, since in the worst case, we need to compare strings by their lexicographically.** Space: O(K) ### 思路二 QuickSort average O(N * M) O(1) 但是不知道为啥在leetcode跑的时候花了超级长时间 ## Code ### 思路一 Priority Queue ```java= class Solution { public String kthLargestNumber(String[] nums, int k) { Queue<String> pq = new PriorityQueue<>(new Comparator<>(){ public int compare(String a, String b){ if(a.length()!=b.length()){ return a.length()-b.length(); } else{ return a.compareTo(b); } } }); for(String num:nums){ pq.add(num); if(pq.size() > k){ pq.poll(); } } return pq.peek(); } } ``` ### 思路二 ```java= class Solution { Random rand; public int compare(String a, String b){ if(a.length()!=b.length()){ return b.length()-a.length(); } else{ return b.compareTo(a); } } public String kthLargestNumber(String[] nums, int k) { rand = new Random(); quickSort(nums, k, 0, nums.length); return nums[k-1]; } public void quickSort(String[] nums, int k, int start, int end){ int selected = start + rand.nextInt(end-start); swap(nums, selected, start); int idx = start; for(int i = start+1;i < end;i++){ if(compare(nums[start], nums[i])>0){ swap(nums, ++idx, i); } } swap(nums, idx, start); if(k == idx-start+1){ return; } else if(k < idx-start+1){ quickSort(nums, k, start, idx); } else{ quickSort(nums, k-(idx-start+1), idx+1, end); } } public void swap(String[] nums, int a, int b){ String temp = nums[a]; nums[a] = nums[b]; nums[b] = temp; } } ```