陣列中的第K個最大元素 【LeetCode 排序】
阿新 • • 發佈:2018-12-11
在未排序的陣列中找到第 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 ≤ 陣列的長度。
題解:可以直接Array.sort()方法,然後進行查詢第n大,就能得到答案,但是呢,你這樣做,面試官會很難受,然後你也就很難受。。。。。。。。。
主要是實現的方法,題目要求返回第n大的值,而不用管其他的值,所以我們可以使用快速排序的思想的實現,關於快速排序又不會的可以檢視我以前關於快速排序的文章,快速排序每次都會將一個數置於最終排序的位置,所以這樣可以最大程度的減少時間複雜度,而且還有一點二分的味道。
public class Main { public static void main(String[] args) { int[] a={3,2,3,1,2,4,5,5,6}; int k=6; System.out.println(findKthLargest(a,k)); } public static int findKthLargest(int[] nums, int k) { //根據快排的思想 int len=nums.length; quickSort(nums,0,len-1,len-k); //例如第一大的數,那就是最後一位了 return nums[len-k]; } private static void quickSort(int[] nums, int l, int r, int k) { //以l為中位數排序兩邊的數 int left=l,right=r; int mid=nums[left]; while(l<r){ //從左邊開始,找到第一個小於nums[l]的值 while(l<r && mid<=nums[r]){ r--; } //從左邊找,找到第一個大於nums[l]的值的值 while(l<r && mid>=nums[l]){ l++; } //交換l和r的值 if(l<r){ int t=nums[l]; nums[l]=nums[r]; nums[r]=t; } } //進行歸為,把mid的值進行交換 nums[left]=nums[l]; nums[l]=mid; //此時l的位置是正確的,然後k和l的位置 if(l>k){ quickSort(nums,left,l-1,k); }else if(l<k){ quickSort(nums,l+1,right,k); }else if(l==k){ return; } } }