用JS实现库存管理 III

学习目标:


学习内容:

仓库管理员以数组 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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值