dedecms网站地图路径修改生成后 网站地图前台路径不变,wordpress 关闭更新,河南濮阳最新消息今天,做网站需求一、题目描述 给定整数数组 nums 和整数 k#xff0c;请返回数组中第 k 个最大的元素。 请注意#xff0c;你需要找的是数组排序后的第 k 个最大的元素#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,…一、题目描述 给定整数数组 nums 和整数 k请返回数组中第 k 个最大的元素。 请注意你需要找的是数组排序后的第 k 个最大的元素而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 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 105-104 nums[i] 104 题目链接. - 力扣LeetCode 二、解题思路
1、随机选择基准元素
2、根据基准元素将数组分为三部分[l, left]该部分小于基准元素key、[left 1, right - 1]等于基准元素key、[right, r]大于基准元素key。
3、计算每部分所包含的元素个数分别为a 、b right - left - 1、 c r - right 1;
4、分情况讨论 三、代码
class Solution {public int findKthLargest(int[] nums, int k) {return qsort(nums, 0, nums.length-1, k);}private int qsort(int[] nums, int l, int r, int k) {if(l r) {return nums[l];}//随机选择基准元素int key nums[new Random().nextInt(r-l1) l];//根据基准元素将数组划分为三组int left l-1, right r1, i l;while(i right) {if(nums[i] key) {swap(nums, left, i);} else if(nums[i] key) {i;} else {swap(nums, --right, i);}}//分情况讨论int b right - left - 1, c r - right 1;if(c k) {return qsort(nums, right, r, k);} else if(b c k) {return key;} else {return qsort(nums, l, left, k - b - c);}}private void swap(int[] nums, int i, int j) {int tmp nums[i];nums[i] nums[j];nums[j] tmp;}
}