importjava.util.Random;classSolution{publicintfindKthLargest(int[] nums,int k){int n = nums.length;int target = n - k;// 因为要找第 k 大元素,等价于找第 n-k 小元素int l =0, r = n -1;while(l <= r){int pIndex =partition(nums, l, r);// 划分后的枢轴位置if(pIndex == target){return nums[pIndex];// 找到目标元素}elseif(pIndex < target){
l = pIndex +1;// 目标元素在右半部分}else{
r = pIndex -1;// 目标元素在左半部分}}return-1;// 理论上应该不会到这里,保证数组一定有效}publicintpartition(int[] nums,int l,int r){Random random =newRandom();int idx = random.nextInt(r - l +1)+ l;// 随机选择枢轴swap(nums, l, idx);// 将枢轴放到数组的最左边int x = nums[l];// 取出枢轴值int i = l +1;// 左侧指针int j = r;// 右侧指针while(i <= j){while(i <= j && nums[i]< x){// 左侧找比枢轴大的
i++;}while(i <= j && nums[j]> x){// 右侧找比枢轴小的
j--;}if(i <= j){swap(nums, i, j);// 交换不符合条件的元素
i++;
j--;}}swap(nums, l, j);// 将枢轴放到正确位置return j;// 返回枢轴的位置}// 交换数组中的两个元素publicvoidswap(int[] nums,int x,int y){int temp = nums[x];
nums[x]= nums[y];
nums[y]= temp;}}
2.前K个高频元素347
桶排序
classSolution{publicint[]topKFrequent(int[] nums,int k){// 创建一个hashmap,并统计每个元素的频率HashMap<Integer,Integer> map =newHashMap<>();for(int num : nums){
map.put(num, map.getOrDefault(num,0)+1);}// 创建桶数组,桶的索引表示元素的频率,桶中的元素是具有相同频率的数字List<Integer>[] bucket =newList[nums.length +1];for(int i =0; i < bucket.length; i++){
bucket[i]=newArrayList<>();}// 将频率存入桶中for(Map.Entry<Integer,Integer> entry : map.entrySet()){
bucket[entry.getValue()].add(entry.getKey());}// 从桶中提取前 k 个频率最高的元素int[] res =newint[k];int index =0;for(int i = bucket.length -1; i >=0&& index < k; i--){for(int num : bucket[i]){
res[index++]= num;if(index == k){break;// 找到 k 个元素后退出}}}return res;}}