LCR 128. 库存管理 I(二分查找)

文章讲述了在给定一个按商品ID升序排列且可能有重复的商品库存表中,如何利用二分查找算法快速找到因紧急调拨而被移动到末尾的最小商品ID。作者提供了详细的代码实现来解决这个问题。
摘要由CSDN通过智能技术生成

仓库管理员以数组 stock 形式记录商品库存表。stock[i] 表示商品 id,可能存在重复。原库存表按商品 id 升序排列。现因突发情况需要进行商品紧急调拨,管理员将这批商品 id 提前依次整理至库存表最后。请你找到并返回库存表中编号的 最小的元素 以便及时记录本次调拨。

示例 1:

输入:stock = [4,5,8,3,4]
输出:3

示例 2:

输入:stock = [5,7,9,1,2]
输出:1

提示:

  • 1 <= stock.length <= 5000
  • -5000 <= stock[i] <= 5000

思路:

1、在有序数组中进行查找,最快的方法就是二分查找。

2、设置low、high指针分别指向数组头和尾。

3、取low和high中间值,与数组下标为high处元素比较。若与下标low处比较则无法判断最小元素在哪个区间,比如数组[1,2,3,4,5]和[3,4,5,1,2],中间元素都大于low元素,但第一个数组最小元在左区间,第二个数组最小元在右区间。

3、若mid值大于high值,表明最小元在[mid+1,high]区间,执行low=mid+1。

4、若mid值小于high值,表明最小元在[low,mid]区间,执行high=mid。

5、若mid值等于high值,无法判断在哪个区间,执行high--进行缩小区间继续比较。

6、循环结束返回low的值即为最小值。

代码实现:

class Solution {
public:
    int stockManagement(vector<int>& stock) {
        int low = 0, high = stock.size() - 1;
        while(low < high)
        {
            int mid = low + (high - low) / 2;
            if(stock[mid] > stock[high])
                low = mid + 1;
            else if(stock[mid] < stock[high])
                high = mid;
            else
                --high;
        }
        return stock[low];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值