1 二分查找法
题目:704
代码:
方法一:左闭右闭区间
#include <iostream>
#include <stdio.h>//标准C库
#include <vector> //容器
using namespace std;
//创建二分查找法类 nums有序数列,target目标值
class erfind
{
//公共权限
public:
//查找函数search
int search(vector<int>& nums, int target)
{
//左闭右闭
int left = 0;
int right = nums.size() - 1;
while (left <= right)//合法区间
{
int middle = (left+right)/2;
//如果目标值比中间值小,说明在左边,更新左区间的右边界
if (target < nums[middle])
{
right = middle - 1;
}
//如果目标值比中间值大,说明在右边,更新右区间的左边界
else if (target > nums[middle])
{
left = middle + 1;
}
//如果目标值等于中间值,返回中间值
else if (target == nums[middle])
{
return middle;
}
}
//如果在整个循环中都找不到目标值,则返回-1
return -1;
}
};
int main()
{
//类实例化对象
erfind er;
//创建容器
vector<int> nums = {1,3,6,8,9,12};
int target = 8;
//由于上面left right middle 都是索引,但是想要显示索引对应的值,search类内函数
int index = er.search(nums, target);
//打印输出
cout << index << endl;
system("pause");
return 0;
}
方法二:左闭右开区间
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(target<nums[middle])
{
right=middle;
}
else if(target>nums[middle])
{
left=middle+1;
}
else if(target==nums[middle])
{
return middle;
}
}
return -1;
}
};
总结:
- 注意==
- 左闭右闭的区间在更新区间的左右边界的时候middle都要加减1,左闭右开区间更新区间的时候闭区间要加1,开区间仍然是middle
- 类的使用:实例化一个对象
- middle right left 都是索引,target是值,所以在比较的时候,middle需要放到nums数组作为下标值
- 二分法适用:有序+无重复