字节的苗子~

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;   

    }
};

总结:

  1. 注意==
  2. 左闭右闭的区间在更新区间的左右边界的时候middle都要加减1,左闭右开区间更新区间的时候闭区间要加1,开区间仍然是middle
  3. 类的使用:实例化一个对象
  4. middle right left 都是索引,target是值,所以在比较的时候,middle需要放到nums数组作为下标值
  5. 二分法适用:有序+无重复

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值