往期文章:二分 - 整数
一、题目
二、代码段
参考往期文章,有如下两种写法
//往期文章写法一
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int l=0,r=nums.size()-1;
while(l<r)
{
int mid=l+r>>1;
if(nums[mid]>=target) r=mid;
else l=mid+1;
}
if(nums[l]==target) return l;
else return -1;
}
};
//往期文章写法二
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int l=0,r=nums.size()-1;
while(l<r)
{
int mid=l+r+1>>1;
if(nums[mid]<=target) l=mid;
else r=mid-1;
}
if(nums[l]==target) return l;
else return -1;
}
};
新写法有不易混淆、易于理解的优点,有如下两种新写法
//新写法一
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int l=-1,r=nums.size();
while(l+1!=r)
{
int m=(l+r)/2;
if(nums[m]<=target) l=m;
else r=m;
}
if(l>=0 && nums[l]==target) return l;
else return -1;
}
};
//最初,l==-1 且 r==nums.size()
//对于按照升序排列的整数数组nums执行完该代码段后:
//1、l+1==r;
//2、若nums中包含小于或等于target的元素,则nums[l]为nums中最后一个小于或等于target的元素,否则l==-1;
//3、若nums中包含大于target的元素,则nums[r]为nums中第一个大于target的元素,否则r==nums.size()
//新写法二
class Solution
{
public:
int search(vector<int>& nums, int target)
{
int l=-1,r=nums.size();
while(l+1!=r)
{
int m=(l+r)/2;
if(nums[m]<target) l=m;
else r=m;
}
if(r<nums.size() && nums[r]==target) return r;
else return -1;
}
};
//最初,l==-1 且 r==nums.size()
//对于按照升序排列的整数数组nums执行完该代码段后:
//1、l+1==r;
//2、若nums中包含小于target的元素,则nums[l]为nums中最后一个小于target的元素,否则l==-1;
//3、若nums中包含大于或等于target的元素,则nums[r]为nums中第一个大于或等于target的元素,否则r==nums.size()