class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int beg=-1,end=nums.size();
while(beg+1<end){
int mid=beg+(end-beg)/2;
if(nums[mid]==target)return mid;
else if(target>nums[mid])beg=mid;
else end=mid;
}
return end;
}
};
查到目标点所在区间 in soreted array
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int>ret(2,-1);
if(nums.empty())return ret;
int beg=-1,end=nums.size();
while(beg+1<end){
int mid=beg+(end-beg)/2;
if(nums[mid]<target)beg=mid;
else end=mid;
}
if(end<nums.size()&&nums[end]==target)ret[0]=end;
else return ret;
end=nums.size();
while(beg+1<end){
int mid=beg+(end-beg)/2;
if(target<nums[mid])end=mid;
else beg=mid;
}
ret[1]=beg;
return ret;
}
};
查找最小值(序列元素互异)in rotated sorted array
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.empty())return -1;
int beg=0,end=nums.size()-1;
while(beg+1<end){
int mid=beg+(end-beg)/2;
if(nums[mid]>nums[end])beg=mid;
else end=mid;
}
return nums[beg]<nums[end]?nums[beg]:nums[end];
}
};
查找最小值(存在相同值)in rotated sorted array
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.empty())return -1;
int beg=0,end=nums.size()-1;
while(beg+1<end){
int mid=beg+(end-beg)/2;
if(nums[mid]<nums[end])
end=mid;
else if(nums[mid]>nums[end]) beg=mid;
else --end;
}
return nums[beg]<nums[end]?nums[beg]:nums[end];
}
};
Search in Rotated Sorted Array 元素互异
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty())return -1;
int low=0,high=nums.size()-1;
while(low+1<high){
int mid=low+(high-low)/2;
if(target==nums[mid])return mid;
if(nums[mid]>=nums[low]){
if(target>=nums[low] && target<nums[mid])high=mid;
else low=mid;
}else{
if(target>nums[mid]&&target<=nums[high])low=mid;
else high=mid;
}
}
if(nums[low]==target)return low;
else if(target==nums[high])return high;
else return -1;
}
};
Search in Rotated Sorted Array II 元素可能存在相同值
class Solution {
public:
bool search(vector<int>& nums, int target) {
if(nums.empty())return false;
int beg=0,end=nums.size()-1;
while(beg+1<end){
int mid=beg+(end-beg)/2;
if(target==nums[mid])return true;
if(nums[mid]>nums[beg]){
if(target>=nums[beg]&&target<nums[mid])end=mid;
else beg=mid;
}else if(nums[mid]<nums[beg]){
if(target>nums[mid]&&target<=nums[end])beg=mid;
else end=mid;
}else{++beg;}
}
if(nums[beg]==target || nums[end]==target)return true;
else return false;
}
};