给定整数数组 nums
和整数 k
,请返回数组中第 **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
提示:
1 <= k <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
1/** 2 * @param {number[]} nums 3 * @param {number} k 4 * @return {number} 5 */ 6var findKthLargest = function(nums, k) { 7 8};
参考答案:
Array.sort从大到小排序,并取值
1/** 2 * @param {number[]} nums 3 * @param {number} k 4 * @return {number} 5 */ 6var findKthLargest = function(nums, k) { 7 nums.sort((a, b) => b - a) 8 return nums[k - 1] 9};
推排序
1/** 2 * @param {number[]} nums 3 * @param {number} k 4 * @return {number} 5 */ 6var findKthLargest = function(nums, k) { 7 let stack = [] 8 9 for (let i = 0; i < nums.length; i++) { 10 const n = nums[i], tmp = [] 11 while(stack.length && stack[stack.length - 1] < n) { 12 tmp.push(stack.pop()) 13 } 14 if (stack.length < k) stack.push(n) 15 while(tmp.length && stack.length < k) { 16 stack.push(tmp.pop()) 17 } 18 } 19 return stack[stack.length - 1] 20};
快速排序,从大到小,取数组下标k-1的元素,即为所求。 因为题目只要求第K大的数字,所以不需要全部排序,只需要比较左右分的下标pos和k-1的大小,对部分区间进行排序即可
1/** 2 * @param {number[]} nums 3 * @param {number} k 4 * @return {number} 5 */ 6var findKthLargest = function(nums, k) { 7 quickSort(0, nums.length - 1) 8 return nums[k-1] 9 10 function quickSort(left, right) { 11 if (left < right) { 12 let pos = partition(left, right) 13 if (pos < k-1) quickSort(pos + 1, right) 14 if (pos > k-1) quickSort(left, pos - 1) 15 } 16 } 17 18 function partition(left, right) { 19 const pivot = nums[right] 20 let i = left 21 for(let j = left; j < right; j++) { 22 if (nums[j] >= pivot) { 23 swap(i++, j) 24 } 25 } 26 swap(i, right) 27 28 return i 29 } 30 31 function swap(i, j) { 32 const tmp = nums[i] 33 nums[i] = nums[j] 34 nums[j] = tmp 35 } 36};
最近更新时间:2022-07-17