这类题核心点是将mid 跟右侧点进行比较,这样可以得到mid左侧还是右侧是有序的,然后跟缩小检测空间,当相等的时候,没有办法确定左侧还是右侧是有序的,这个时候进行r--。
搜索旋转排序数组- 无重复数字
* [33] 搜索旋转排序数组
* 力扣
int search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0;
int r = n-1;
while(l<=r)
{
int mid = l + (r-l)/2;
if(nums[mid] == target)
{
return mid;
}
if(nums[mid]>nums[r]) // 左边有序
{
if(target >= nums[l] and target < nums[mid])
{
r = mid - 1;
}
else
{
l = mid + 1;
}
}
else
{
if(target <= nums[r] and target > nums[mid])
{
l = mid + 1;
}
else
{
r = mid -1;
}
}
}
return -1;
}
搜索旋转排序数组-有重复数字
* [81] 搜索旋转排序数组 II
* 力扣
bool search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0;
int r = n-1;
while(l<=r)
{
int mid = l + (r-l)/2;
if(nums[mid] == target)
{
return true;
}
// 解法二
if(nums[mid] < nums[r])// mid 右边有序
{
if(target > nums[mid] and target <= nums[r])
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
else if(nums[mid] > nums[r])
{
if(target < nums[mid] and target >= nums[l])
{
r = mid - 1;
}
else
{
l = mid + 1;
}
}
else
{
r--;
}
}
寻找旋转排序数组中的最小值 - 无重复数字
* [153] 寻找旋转排序数组中的最小值
* 力扣
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while(left<right)
{
int mid = left + (right - left)/2;
if(nums[mid] > nums[right])// 左侧有序
{
left = mid + 1;
}
else
{
right = mid;
}
}
return nums[left];
}
寻找旋转排序数组中的最小值 - 有重复数字
* [154] 寻找旋转排序数组中的最小值 II
* 力扣
int findMin(vector<int>& nums) {
int n = nums.size();
int left = 0,right = n - 1;
while(left <= right)
{
if(left == right)
{
break;
}
int mid = left + (right - left)/2;
if (nums[mid] < nums[right])//右侧有序
{
right = mid;
}
else if(nums[mid] > nums[right])
{
left = mid + 1;
}
else
{
right--;
}
}
return nums[left];
}