利用快速排序思想,n 为数组的长度 数组中的第 1 大元素,是,从小到大排序后 n - 1 位置上的元素 数组中的第 k 大元素,即,从小到大排序后 n - k 位置上的元素 我们希望位置 n - k 的左边是比它小的,右边是比它大的,那么 nums[n - k] 就是第 k 大的元素 我们把 n-k 看作 pivot ,用快速排序的手法去 partition “分区”
代码实现
/** * @param {number[]} nums * @param {number} k * @return {number} */ var findKthLargest = function (nums, k) { let K = nums.length - k; let start = 0, end = nums.length - 1; while (start < end) { let p = partition(nums, start, end); if (p === K) { return nums[p]; } elseif (p < K) { start = p + 1 } else { end = p - 1; } } return nums[start]; }; functionpartition(nums, start, end) { let random=Math.floor(Math.random() * (end - start + 1) + start) swap(nums,start,random) let pivot=nums[start] while (start < end) { while (nums[end] >= pivot && start < end) { end--; }; nums[start] = nums[end]; while (nums[start] < pivot && start < end) { start++; } nums[end] = nums[start]; } nums[start] = pivot; return start; } // 快速排序中使用 swap 的地方比较多,我们提取成一个独立的函数 functionswap(arr, i, j) { [arr[i], arr[j]] = [arr[j], arr[i]]; }