leetcode704
//前提是数组为有序数组,同时题目还强调数组中无重复元素—>二分法
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right){ //左闭右闭
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle-1; // target 在右区间,所以[middle + 1, right]
}
else if(nums[middle]<target){
left=middle+1; // target 在左区间,所以[left, middle - 1]
}
else{
return middle;
}
}
return -1;
}
};
leetcode 35
//有序数组----->二分法
//封闭法
//有两种情况①:恰好有middle元素位置 ②两元素中间位置。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle=(right+left)/2;
if(nums[middle]<target){
left=middle+1;
}
else if(nums[middle]>target){
right=middle-1;
}
else{
return middle; // 情况①恰好有相等元素 return middle
}
}
return right+1; //②两元素中间位置 恰好反过来[right,left] return right+1
}
};
关于第二种情况的手推