铁岭做网站哪家好,定制网站成本多少,网站建设公司自贡,展示型网站模板源码题目链接
题目:
分析:
这道题很明显是一个top-K问题, 我们很容易想到用堆排序来解决, 堆排序的时间复杂度是O(N*logN), 不符合题意, 所以我们可以用另一种方法:快速选择算法, 他的时间复杂度为O(N)快速选择算法, 其实是基于快排, 进行修改而成, 我们还是使用将将数组分…题目链接
题目:
分析:
这道题很明显是一个top-K问题, 我们很容易想到用堆排序来解决, 堆排序的时间复杂度是O(N*logN), 不符合题意, 所以我们可以用另一种方法:快速选择算法, 他的时间复杂度为O(N)快速选择算法, 其实是基于快排, 进行修改而成, 我们还是使用将将数组分成三块 的方法来实现快排排序数组 ---- 分治-快排-CSDN博客此时我们每一块的元素个数分别设为a b c情况一: 如果第k个最大元素落在key的区间, 说明此时c一定是k的, 此时只需要去[right, r]区间去找第k个最大元素即可情况二: 如果第k个最大元素落在key的区间, 那么bc一定是k的, 此时只需要返回key即可, 因为这个区间都是key情况三: 如果不是上述两种情况, 那么第k个最大元素一定落在key的区间, , 此时需要去[l, left]区间去找, 但是我们要找的是第k-b-c大的元素, 因为我们舍去了key和key的区间
代码:
class Solution {public int findKthLargest(int[] nums, int k) {return qsort(nums, 0, nums.length - 1, k);}public int qsort(int[] nums, int l, int r, int k) {if (l r)return nums[l];int key nums[new Random().nextInt(r - l 1) l];int left l - 1;int right r 1;int i l;while (i right) {if (nums[i] key) {swap(nums, i, left);} else if (nums[i] key) {i;} else {swap(nums, i, --right);}}// [l,left] [left 1, right - 1] [right, r]int c r - right 1;int b right - left - 1;if (c k)return qsort(nums, right, r, k);else if (b c k)return key;elsereturn qsort(nums, l, left, k - b - c);}public void swap(int[] nums, int i, int j) {int t nums[i];nums[i] nums[j];nums[j] t;}
}