題目
在未排序的數組中找到第 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 ≤ 數組的長度。
鏈接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
解題記錄
- 直接通過api進行排序
- 取排序後數組後k個
/**
* @author ffzs
* @describe
* @date 2020/6/29
*/
public class Solution {
public int findKthLargest(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length-k];
}
}
進階
- 通過使用二分查找的快速排序進行確定第K大的數
- 通過選取中間值,通過交換前後值的方法,確定一個點right,使得其爲一個mid值分解線,就是說大於j的都是大於等於mid的值
- 如果r-right大於等於k說明,K大在右邊
- 否者在左邊
- 二分遞歸,知道只剩一個值,left==right時,這個值便是k
/**
* @author ffzs
* @describe
* @date 2020/6/29
*/
public class Solution2 {
public static int findKthLargest(int[] nums, int k) {
return quickSort(nums, 0, nums.length - 1, k);
}
private static int quickSort (int[] nums, int l, int r, int k) {
if (l == r) return nums[l];
int mid = nums[l+r >> 1];
int left = l, right = r;
while (true) {
while (nums[left] < mid) left ++;
while (nums[right] > mid) right --;
if (left < right) swap(nums, left++, right--);
else break;
}
if (r-right>=k) return quickSort(nums, right +1, r, k);
else return quickSort(nums, l, right, k-(r-right));
}
private static void swap (int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
public static void main(String[] args) {
int[] nums = {3,2,3,1,2,4,5,5,6};
System.out.println(findKthLargest(nums, 4));
}
}