zoukankan      html  css  js  c++  java
  • 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;
    	}
    };
    
  • 相关阅读:
    input输入框与元素间有间隙
    显示3行,还要省略号(这个属性比较合适WebKit浏览器或移动端(绝大部分是WebKit内核的)浏览器)
    input file 修改按钮名称
    文本溢出处理
    移动WEB前端开发资源的一些素材
    带弹性的导航栏
    带重力的公告栏
    淘宝放大镜效果
    【规范】javascript 变量命名规则(转)
    常见的仿Flash图片轮播效果
  • 原文地址:https://www.cnblogs.com/sykline/p/15157763.html
Copyright © 2011-2022 走看看