class Solution {
public int inventoryManagement(int[] stock) {
int l = 0;
int r = stock.length - 1;
int result = stock[0];
while (l <= r) {
int mid = l + (r - l) / 2;
System.out.println(r);
if (stock[mid] > stock[r]) {
result = stock[mid + 1];
l = mid + 1;
} else if (stock[mid] < stock[r]) {
r = mid;
} else {
r--;
}
}
return result;
}
}
class Solution {
public int findMin(int[] nums) {
int l = 0, r = nums.length-1;
while(l < r){
int m = (l + r)/2;
// 右有序,旋转点在左边
if(nums[m] < nums[r]){
r = m;
}else if(nums[m] > nums[r]){
l = m + 1;
}else{
r–;
}
}
return nums[l];
}
}
思路:相较于之前的二分只判断两种情况,这种需要在等于时缩小右区间
时间:O(lgn)
空间:O(1)
共以下 14 个回答
打卡
class Solution {
public int inventoryManagement(int[] stock) {
int low = 0;
int high = stock.length – 1;
while(low < high){
int mid = low + (high – low) / 2;
if(stock[mid] < stock[high]){
high = mid;
}else if(stock[mid] > stock[high]){
low = mid + 1;
}else{
high -= 1;
}
}
return stock[low];
}
}
打卡
解题思路
– 按照目标节点把数据分成{左侧,目标数据,右侧},左侧的任一数据都比右侧的全部数据大于等于
– 目标数据是右侧数据中的最小值
– 通过比较stock[mid]和stock[right]的大小去判断mid在哪一侧,但是当stock[mid]=stock[right]是无法判断在哪一侧的,只能让right–去逐渐逼近
【题解1】
思路:用中间点的值和左右区间端点的值比较,正常有序升序应该是左小右大,如果中间点的值大于右端点则说明旋转点在右半区间内
当stock[mid] = stock[r]时,无法判断mid点在左侧还是右侧,此时执行r–,若r是旋转点,且r与数组中间点的值相同,说明数组全相等,答案也正确。
时间复杂度O(logN),若数组值全相等则退化为O(N),空间复杂度O(1)。
时间o(logn)空间o(1)
需注意的点:
1、当
stock[mid] == stock[right]时,刚开始写的是right = mid - 1;是错误的,因为有两种可能:(1)【考虑到了】最小值可能在前半部分,后部分重复;
(2)【没有考虑到】也可能能前半部分都是重复值,而最小值在后半部分。e.g.这种情况:
3,3,1,3;。正确操作是right--;。2、当
stock[mid] < stock[right]时,刚开始写的是right = mid - 1;是错误的,因为stock[mid]本身可能就是最小值,这样会跳过。e.g.这种情况:10,10,1,10,10;正确操作是right = mid。3、最后两行,是为了以防万一没找到最小值加的。不加也可以
时间复杂度O(logn)
空间复杂度O(1)
class Solution {
public int findMin(int[] nums) {
int l = 0, r = nums.length-1;
while(l < r){
int m = (l + r)/2;
// 右有序,旋转点在左边
if(nums[m] < nums[r]){
r = m;
}else if(nums[m] > nums[r]){
l = m + 1;
}else{
r–;
}
}
return nums[l];
}
}
思路:相较于之前的二分只判断两种情况,这种需要在等于时缩小右区间
时间:O(lgn)
空间:O(1)
//把stork[mid]的值和stork[right]的值做比较,结果有三种情况
class Solution {
public int inventoryManagement(int[] stock) {
int left = 0;
int right = stock.length – 1;
}
思路:二分查找。
时间复杂度:O(logn)
空间复杂度:O(1)