尋找給定的一個數組中第k大的一個數,或者是尋找前k大個數
阿新 • • 發佈:2018-12-16
這道題是一道常見的面試題,其實這道題可以用快速排序的思想來實現,而且求前k大個數和第k大的數,其實思路是一樣的,都是用快排的思想。只要不停遍歷,直到找到分界點,即該分界點的右邊的數都比該分界點大;該分界點左邊的數都比該分界點小。而且剛好該分界點即為第k大的數。
public static void Kth(int[] nums,int k) { int result = Kthtemp(nums,0,nums.length - 1,k); //for(int i = result; i < nums.length; i++) // System.out.print(nums[i] + " "); //System.out.println(); //System.out.println(nums[result]); } public static int Kthtemp(int[] nums,int low,int high,int k) { int middle = getMiddle(nums, low, high); if (high - middle + 1 > k) return Kthtemp(nums, middle + 1, high, k); else if (high - middle + 1 < k) //遞迴實現,呼叫該函式自身,調整的是個數 return Kthtemp(nums, 0, middle - 1, k - (high - middle + 1)); else //當該分界點為k,那麼直接返回該下標 return middle; } public static int getMiddle(int[] array,int low,int high) { //快排的思路,每次尋找分界點 int tmp = array[low]; while(low < high) { while(low < high && array[high] > tmp) high--; array[low] = array[high]; while(low < high && array[low] < tmp) low++; array[high] = array[low]; } array[low] = tmp; //System.out.print(array[low] + " "); return low; }
這道題是快排的變化題,需要不斷溫故。