“`java
//排序
class Solution {
int count = 0;
public int[] inventoryManagement(int[] stock, int cnt) {
if (stock == null || stock.length <= 0) {
return new int[0];
}
count = cnt;
quickSort(stock, 0, stock.length - 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 left, int right) {
if (left >= right || left >= count) {
return;
}
int pivotI = new Random().nextInt(right - left + 1) + left;
swap(stock, pivotI, right);
int pivot = stock[right];
int i = left - 1;
for (int j = left; j < right; j++) {
if (stock[j] <= pivot) {
i++;
swap(stock, i, j);
}
}
i = i + 1;
swap(stock, i, right);
quickSort(stock, left, i - 1);
quickSort(stock, i + 1, right);
}
public void swap(int[] stock, int i, int j) {
int tmp = stock[i];
stock[i] = stock[j];
stock[j] = tmp;
}
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
def heapify(arr, start, end):
largest = start
left = start * 2 + 1
right = start * 2 + 2
if left < end and arr[largest] < arr[left]:
largest = left
if right < end and arr[largest] < arr[right]:
largest = right
if largest != start:
arr[largest], arr[start] = arr[start], arr[largest]
heapify(arr, largest, end)
def heap_sort(arr):
n = len(arr)
for i in range(n // 2 - 1, -1, -1):
heapify(arr, i, n)
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, 0, i)
return arr
return heap_sort(arr)[:k]
class Solution {
int k;
void quickSortMin(vector& arr, int left, int right) {
if (left >= right) return;
int mid = arr[left];
int l = left, r = right;
// find the position for mid
while(l < r) {
while(arr[r] > mid && l < r) r--;
while(arr[l] <= mid && l < r) l++;
if (l < r) std::swap(arr[l], arr[r]);
}
if (arr[l] < mid) std::swap(arr[left], arr[l]);
// sort the left/right part if need to
if (l < k) { // no need to sort the left part
quickSortMin(arr, l + 1, right);
} else if (l > k) { // only need to sort the left part
quickSortMin(arr, left, l - 1);
} else return;
}
public:
vector getLeastNumbers(vector& arr, int k) {
this->k = k;
quickSortMin(arr, 0, arr.size() - 1);
arr.resize(k);
return arr;
}
};
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
heapq.heapify(arr)
res = []
while k > 0:
res.append(heapq.heappop(arr))
k -= 1
return res
共以下 18 个回答
“`java
//排序
class Solution {
int count = 0;
public int[] inventoryManagement(int[] stock, int cnt) {
if (stock == null || stock.length <= 0) { return new int[0]; } count = cnt; quickSort(stock, 0, stock.length - 1); int[] res = new int[cnt]; for (int i = 0; i < cnt; i++) { res[i] = stock[i]; } return res; }
}
class Solution {
public int[] getLeastNumbers(int[] arr, int k) {
Arrays.sort(arr);
return Arrays.copyOf(arr,k);
}
}
直接api
随机化三路快排 时间复杂度O(n) 空间复杂度O(logn)
堆排序 时间复杂度O(nlogn) 空间复杂度 O(1)
“`C++ getLeastNumbers(vector & arr, int k) { result;
vector
vector
}
“`
【思路】用快排思路,每次随机取一个数作为mid并将其他数分至其两侧,递归的时候需要判断mid的index与k的大小关系:若index=k则可以直接返回(此时index左侧的即为最终答案);index<k则只需要对右侧做进一步排序;index>k则只需要对左侧做进一步排序。
【复杂度】时间复杂度O(n),空间复杂度O(1);如果使用堆排序思路,时间复杂度为O(nlogk),空间复杂度O(k)
思路:快排中枢
时间复杂度O(N) 空间复杂度O(logN)
时间复杂度:O(N)
空间复杂度:O(logN)
快速排序
使用heap
时间复杂度:O(n)
空间复杂度:O(n)
排序
快排
时间复杂度O(logk)+O(n)
时间复杂度:O(n)
空间复杂度:O(logn)
MY偷懒