class Solution {
public int findKthLargest(int[] nums, int k) {
//快速选择算法,返回第k大的元素
int res = quickSort(nums,0,nums.length - 1,k);
return res;
}
public int quickSort(int[] nums,int l,int r,int k){
//当只有一个元素或则区间不存在时,直接返回
if(l >= r) return nums[l];
//数组分三块 [l,left][left + 1,right - 1][right,r]
int key = nums[new Random().nextInt(r - l + 1) + l];
int left = l - 1,cur = l,right = r + 1;
while(cur < right){
if(nums[cur] < key){
swap(nums,++left,cur++);
}else if(nums[cur] == key){
cur++;
}else{
swap(nums,--right,cur);
}
}
//分别对a b c 三个区间做判断,合适的区间
int b = right - left - 1,c = r - right + 1;
if(c >= k) return quickSort(nums,right,r,k);
else if(b + c >= k) return key;
//如果都不是,就去[l,left]区间找k - b - c大的元素
else return quickSort(nums,l,left,k - b - c);
}
public void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
运行结果:
解法二:简单粗暴优先级队列
代码详解:
java复制代码
class Solution {
public int findKthLargest(int[] nums, int k) {
PriorityQueue<Integer> heap = new PriorityQueue<>((o1,o2)->{
return o2.compareTo(o1);
});
for(int i = 0;i < nums.length;i++){
heap.offer(nums[i]);
}
int res = 0;
for(int i = 0;i < k;i++){
res = heap.poll();
}
return res;
}
}
class Solution {
public int[] inventoryManagement(int[] stock, int k) {
quickSort(stock,0,stock.length - 1,k);
int[] res = new int[k];
for(int i = 0;i < k;i++){
res[i] = stock[i];
}
return res;
}
public void quickSort(int[] nums,int l,int r,int k){
if(l >= r) return ;
//随机取数
int key = nums[new Random().nextInt(r - l + 1) + l];
int left = l - 1,cur = l,right = r + 1;
while(cur < right){
if(nums[cur] < key){
swap(nums,++left,cur++);
}else if(nums[cur] == key){
cur++;
}else{
swap(nums,--right,cur);
}
}
//寻找区间最小k个值[l,left] [left + 1,right - 1][right,r]
int a = left - l + 1,b = right - left - 1;
if(a > k) quickSort(nums,l,left,k);
else if(a + b >= k) return ;
else quickSort(nums,right,r,k - a - b);
}
public void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
运行结果:
解法二:简单粗暴排序
代码详解:
java复制代码
class Solution {
public int[] inventoryManagement(int[] stock, int cnt) {
Arrays.sort(stock);
int[] res = new int[cnt];
for(int i = 0;i < cnt;i++){
res[i] = stock[i];
}
return res;
}
}
运行结果:
解法三:简单粗暴优先级队列
代码详解:
java复制代码
class Solution {
public int[] inventoryManagement(int[] stock, int cnt) {
PriorityQueue<Integer> heap = new PriorityQueue<>();
for(int i = 0; i < stock.length; i++){
heap.offer(stock[i]);
}
int[] res = new int[cnt];
for(int i = 0;i < cnt;i++){
res[i] = heap.poll();
}
return res;
}
}