33. 搜索旋转排序数组
//不重复元素数组
int search(int* nums, int numsSize, int target){
int l=0,r=numsSize-1;
while(l<=r)
{
int mid=(l+r)/2;
if(nums[mid]==target)return mid;
if(nums[l]<=nums[mid])//注意等号,否则else中target<=nums[r]&&target<nums[mid]的情况错误
{
if(target>=nums[l]&&target<nums[mid])//在左边界
r=mid-1;
else //在右边界,向右出界
l=mid+1;
}
else{//l~mid无序,mid~r必有序,判断在右边界情况
if(target<=nums[r]&&target>nums[mid])
l=mid+1;
else//向左找
r=mid-1;
}
}
return -1;
}
81. 搜索旋转排序数组 II
//重复元素数组
bool search(int* nums, int numsSize, int target){
int l=0,r=numsSize-1;
while(l<=r)
{
//处理循环元素
while(l<r&&nums[l]==nums[l+1])l++;
while(l<r&&nums[r]==nums[r-1])r--;
int mid=(l+r)/2;
if(nums[mid]==target)return 1;
if(nums[l]<=nums[mid])
{
if(target>=nums[l]&&target<nums[mid])
r=mid-1;
else
l=mid+1;
}
else
{
if(target>nums[mid]&&target<=nums[r])
l=mid+1;
else
r=mid-1;
}
}
return 0;
}
153. 寻找旋转排序数组中的最小值
//不重复元素数组
int findMin(int* nums, int numsSize){
int l=0,r=numsSize-1;
while(l<r)
{
int mid=(l+r)/2;
//找含有最小值的有序范围,不断减小其范围
if(nums[mid]<nums[r])
r=mid;
else
l=mid+1;
}
return nums[l];
}
154. 寻找旋转排序数组中的最小值 II
int findMin(int* nums, int numsSize){
int l=0,r=numsSize-1;
while(l<r)
{
//转化为已知问题
while(l<r&&nums[l]==nums[l+1])l++;
while(l<r&&nums[r]==nums[r-1])r--;
if(l==r)return nums[l];
int mid=(l+r)/2;
if(nums[mid]<nums[r])
r=mid;
else
l=mid+1;
}
return nums[l];
}
1095. 山脉数组中查找目标值
class Solution {
public:
int findInMountainArray(int target, MountainArray &mountainArr) {
int l=0,r=mountainArr.length()-1;
//找出最大峰值的下标max
while(l<r)
{
int mid=(l+r)/2;
if(mountainArr.get(mid)<mountainArr.get(mid+1))
l=mid+1;
else
r=mid;
}
int max=r;
//两次二分找值
l=0,r=max;
while(l<=r)
{
int mid=(l+r)/2;
if(mountainArr.get(mid)==target)return mid;
if(mountainArr.get(mid)<target)
l=mid+1;
else
r=mid-1;
}
l=max,r=mountainArr.length()-1;
while(l<=r)
{
int mid=(l+r)/2;
if(mountainArr.get(mid)==target)return mid;
if(mountainArr.get(mid)<target)
r=mid-1;
else
l=mid+1;
}
return -1;
}
};