• LeetCode704 二分查找


    题目:

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

    示例1:

    输入: nums = [-1,0,3,5,9,12], target = 9
    输出: 4
    解释: 9 出现在 nums 中并且下标为 4

    示例2:

    输入: nums = [-1,0,3,5,9,12], target = 2
    输出: -1
    解释: 2 不存在 nums 中因此返回 -1

    提示:

    1. 你可以假设 nums 中的所有元素是不重复的。
    2. n 将在 [1, 10000]之间。
    3. nums 的每个元素都将在 [-9999, 9999]之间。

    解题:

    看到“搜索”、“有序”、“不重复”,第一想法就是二分查找了,在写二分查找的时候一定要注意处理好边界条件,不然就写乱了。翻阅网上的资料学习后,记录并留作回顾。

    根据区间定义来实现二分查找,区间定义有两种[left, right]和[left, right)。

    第一种[left,right]

    • 因为区间左闭右闭,(left)是有可能等于(right)的,所以while的判断条件应该为((left le right))
    • 如果(num[mid] > target),因为(num[mid])不等于(target),而区间又是右闭区间,所以只能(right=mid-1)
    • 如果(num[mid] < target),因为(num[mid])不等于(target),而区间又是左闭区间,所以只能(left=mid+1)

    代码

    class Solution {
    public:
    	int search(vector<int>& nums, int target) {
    		int mid = nums.size() / 2;
    		int left = 0;
    		int right = nums.size() - 1; // 注意是右闭区间
    		while (left <= right) {
    			if (nums[mid] == target) {
    				return mid;
    			}
    			if (nums[mid] > target) {
    				right = mid - 1;
    			}
    			else {
    				left = mid + 1;
    			}
    			mid = (left + right) / 2;
    		}
    		return -1;
    	}
    };
    

    第二种[left,right)

    • 因为区间左闭右开,(left)不可能等于(right),所以while的判断条件应该为((left < right))
    • 如果(num[mid] > target),因为(num[mid])不等于(target),而区间又是右开区间,所以只能(right=mid)
    • 如果(num[mid] < target),因为(num[mid])不等于(target),而区间又是左闭区间,所以只能(left=mid+1)

    代码

    class Solution {
    public:
    	int search(vector<int>& nums, int target) {
    		int mid = nums.size() / 2;
    		int left = 0;
    		int right = nums.size(); // 右开区间右边界
    		while (left < right) {
    			if (nums[mid] == target) {
    				return mid;
    			}
    			if (nums[mid] > target) {
    				right = mid;
    			}
    			else {
    				left = mid + 1;
    			}
    			mid = (left + right) / 2;
    		}
    		return -1;
    	}
    };
    
  • 相关阅读:
    [国家集训队]数颜色 / 维护队列
    【模板】二逼平衡树(线段树+平衡树)
    jenkins实现接口自动化持续集成(python+pytest+ Allure+git)
    Locust快速上手指南
    缓解多分类的样本不均衡问题
    PlayStation@4功能介绍及测试应用
    APP专项测试-弱网测试
    游戏自动化测试-局内战斗
    Windows下JMeter分布式压测环境搭建
    基于simhash的文本去重原理
  • 原文地址:https://www.cnblogs.com/sykline/p/15157763.html
Copyright © 2020-2023  润新知