class Solution {
public int[] inventoryManagement(int[] stock, int cnt) {
int len = stock.length;
if (cnt == 0) {
return new int[0];
}
quickSort(stock, 0, len - 1);
int[] res = new int[cnt];
for (int i = 0; i < cnt; i++) {
res[i] = stock[i];
}
return res;
}
public void quickSort(int[] stock, int l, int r) {
if (l < r) {
int pivot = stock[l];
int i = l;
int j = r;
while (i < j) {
while (i < j && stock[j] >= pivot) {
j--;
}
stock[i] = stock[j];
while (i < j && stock[i] < pivot) {
i++;
}
stock[j] = stock[i];
}
stock[i] = pivot;
quickSort(stock, l, i-1);
quickSort(stock, i + 1, r);
}
}
}
class Solution {
public int[] inventoryManagement(int[] stock, int cnt) {
int[] ans = new int[cnt];
randomizedSelect(stock, cnt - 1);
for (int i = 0; i < cnt; i++) {
ans[i] = stock[i];
}
return ans;
}
// 如果arr排序的话,在i位置的数字是什么
public static void randomizedSelect(int[] arr, int i) {
int ans = 0;
for (int l = 0, r = arr.length - 1; l <= r;) {
// 随机这一下,常数时间比较大
// 但只有这一下随机,才能在概率上把时间复杂度收敛到O(n)
partition(arr, l, r, arr[l + (int) (Math.random() * (r - l + 1))]);
// 因为左右两侧只需要走一侧
// 所以不需要临时变量记录全局的first、last
// 直接用即可
if (i < first) {
r = first - 1;
} else if (i > last) {
l = last + 1;
} else {
break;
}
}
}
// 荷兰国旗问题
public static int first, last;
public static void partition(int[] arr, int l, int r, int x) {
first = l;
last = r;
int i = l;
while (i <= last) {
if (arr[i] == x) {
i++;
} else if (arr[i] < x) {
swap(arr, first++, i++);
} else {
swap(arr, i, last--);
}
}
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
//排序后取出cnt个数
public int[] inventoryManagement(int[] stock, int cnt) {
int [] result = new int [cnt];
Arrays.sort(stock);
for (int i = 0; i < cnt; i++) {
result[i] = stock[i];
}
return result;
}
共以下 9 个回答
时间复杂度O(nlogn)
空间复杂度O(logn)
解题思路
– 先排序再选择前面k个
– 问题的关键就变成了排序,这里使用堆排序,来练习一下堆排序
【题解1】
思路: 排序 选择前 cnt
利用快速排序算法进行排序,返回数组前cnt个元素。
时间复杂度O(Nlogn),空间复杂度O(N)。
方法一:快排,但每次只排一边,O(n)
方法二:堆排,大根堆,要插入的数比堆顶小,就弹出堆顶,O(nlogcnt)
//排序后取出cnt个数
public int[] inventoryManagement(int[] stock, int cnt) {
int [] result = new int [cnt];
Arrays.sort(stock);
for (int i = 0; i < cnt; i++) {
result[i] = stock[i];
}
return result;
}
思路:大顶堆、快排、快速选择
时间复杂度:O(nlogn)、O(nlogn)、O(n)
空间复杂度:O(n)、O(n)、O(logn)
这个题目就i是排序一下取数组前cnt个元素就好
快排思想:
Ologn Ologn
堆排序
java Priorityqueue默认维护一个最小堆,二叉树的根节点一定是最小的,从而直接取cnt个根节点就可以完成题目
OLogn O1