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

已排序数组,寻找旋转点;

题目需要最小的元素,将数组从旋转点分为左右两部分,右部分元素小于左部分任何一个元素,可知最小值一定在右部分存在(没有旋转默认为右部分)

所以考虑比较stock[mid]与stock[right]

stock[mid]>stock[right]:mid处于左部分

stock[mid]<stock[right]:mid处于右部分

stock[mid]==stock[right]:无法判断,但是r可以-1来缩小范围,如果r处于最小值因为stock[mid]==stock[right]所以最后仍可以找到,如果增大left的话,left处于最小值则会直接剔除

假如比较stock[left]会出现,当stock[mid]>stock[left]时,如果数组没有旋转无法判断mid处于哪一部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int inventoryManagement(vector<int> &stock) {
int l = 0;
int r = stock.size() - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (stock[mid] > stock[r]) {
l = mid + 1; // stock[mid]>stock[r]所以mid元素一定不是最小----直接跳过
} else if (stock[mid] < stock[r]) {
r = mid;
} else {
r -= 1;
}
}
return stock[l];
}
};