题目
二分查找
在一个有序数组中,设置左left、右right、中间三个标志位,将整个数组一分为二。将目标值与中间middle标志位进行比较
- middle<target,缩小区间至右方数组,left变化
- middle>target,缩小区间至左方数组,right变化
- middle=target,直接返回middle,即target位置
书写时分为左闭右闭[ ]或左闭右开[ )区间
注意当区间缩小时,仍保持左闭右闭或左闭右开,此为left/right+-1关键
左闭右闭
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)
{
return middle;
}
else if(nums[middle] > target )
{
right = middle-1;
}
else if(nums[middle] < target )
{
left = middle+1;
}
}
return -1;
}
};
左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开
int left = 0;
int right = nums.size();
while(left < right)
{
int middle = (left+right) / 2 ;
if(nums[middle] > target)
{
//永远保持左闭右开使right所在数不包括在区间内,若right = middle-1;则变为左闭右闭区间,
right = middle;
}
else if(nums[middle] < target)
{
//同理
left = middle+1;
}
else
{
return middle;
}
}
return -1;
}
};
总结
难点在于:
- 先确定区间范围,再书写判定条件
- 切记left,middle,right都是位置值,并不是指针,nums[ ]来取值
- int a =7/2 a = 3,舍掉小数部分