给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
思路1:左闭右闭,注意两侧均为闭,思考清楚循环时的条件及end初值,mid= (start +end)/2与目标值不等时,start和end应怎么移动。代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int start = 0, end = nums.size()-1;//左闭右闭
while (start<=end)
{
int mid = (start + end) / 2;
if (nums[mid] < target)
{
start = mid + 1;
continue;
}
if (nums[mid] > target)
{
end = mid-1 ;
continue;
}
if(nums[mid]== target)
{
return mid;
}
if (nums[start] == target) { return start; }
if (nums[end] == target) { return end; }
}
return -1;
}
};
思路2:左闭右开,注意两侧开闭不一样,mid= (start +end)/2与目标值不等时,start和end的移动,循环时的条件及end初值与思路1有何不同.代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int start = 0, end = nums.size();//左闭右闭
while (start<end)
{
int mid = (start + end) / 2;
if (nums[mid] < target)
{
start = mid + 1;
continue;
}
if (nums[mid] > target)
{
end = mid ;
continue;
}
if(nums[mid]== target)
{ return mid;}
if (nums[start] == target)
{ return start;}
}
return -1;
}
};
总结:
二分法是非常重要的基础算法,主要就是对区间的定义没有理解清楚,在循环中没有始终坚持根据查找区间的定义来做边界处理。区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。