基本思想:
利用快速排序,只要找到第k个数,其左边的值都小于该元素,右边的值都大于该元素即可(左半区和右半区可以无序)。
代码如下:
代码中的k的值(k对数组中对应元素的索引)是转化后的值 如果是求第K小数,那么k = K - 1;如果是求第K大数,那么k = n - K; int partition(vector<int>& nums, int left, int right) { int pivotValue = nums[left]; while(left < right) { while(left < right && nums[right] >= pivotValue) right--; nums[left] = nums[right]; while(left < right && nums[left] <= pivotValue) left++; nums[right] = nums[left]; } nums[left] = pivotValue; return left; } int findKth(vector<int>& nums, int left, int right, int k) { if(left <= right) { int pivotInd = partition(nums, left, right); if(pivotInd == k) return nums[k]; else if(pivotInd < k) return findKth(nums, pivotInd + 1, right, k); else return findKth(nums, left, pivotInd - 1, k); } return -1; }