学习目标:
- 库存管理 III
- leetcode原题链接
学习内容:
仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限。
示例 1:
示例 1:
输入:stock = [2,5,7,4], cnt = 1
输出:[2]
示例 2:
输入:stock = [0,2,3,6], cnt = 2
输出:[0,2] 或 [2,0]
提示:
0 <= cnt <= stock.length <= 10000
0 <= stock[i] <= 10000
解题思路:
这是一道典型的考察排序算法的题目,将stock进行排序后通过slice方法取出前cnt个数的数组就是返回结果,这里抛转引玉列出部分排序算法.大家也可以在评论区写出更多解法。
sort方法
// 首先是最基本的JS数组提供的sort方法
var inventoryManagement = function(stock, cnt) {
return stock.sort((a,b)=>a-b).slice(0,cnt)
};
经典的冒泡排序
// 冒泡排序算法的时间复杂度是O(n^2)
var inventoryManagement = function(stock, cnt) {
return bubbleSort(stock).slice(0,cnt)
};
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { // 相邻元素两两对比
var temp = arr[j+1]; // 元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
稳定的快速排序
// 快速排序的最坏时间复杂度也是O(n^2),平均时间复杂度和最好时间复杂度都是O(nlogn)
var inventoryManagement = function(stock, cnt) {
return quickSort(stock).slice(0,cnt)
};
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
const pivotIndex = Math.floor(arr.length / 2);
const pivot = arr.splice(pivotIndex, 1)[0];
const left = [];
const right = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
}
用空间换时间的计数排序
// 计数排序的时间复杂度是O(n+k)
var inventoryManagement = function(stock, cnt) {
return countingSort(stock).slice(0,cnt)
};
function countingSort(arr, maxValue) {
let bucket = new Array(maxValue + 1),
sortedIndex = 0;
arrLen = arr.length,
bucketLen = maxValue + 1;
for (var i = 0; i < arrLen; i++) {
if (!bucket[arr[i]]) {
bucket[arr[i]] = 0;
}
bucket[arr[i]]++;
}
for (var j = 0; j < bucketLen; j++) {
while(bucket[j] > 0) {
arr[sortedIndex++] = j;
bucket[j]--;
}
}
return arr;
}