仓库管理员以数组 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];
}
};