首页 > 其他分享 >二分查找-LeetCode704 简单题

二分查找-LeetCode704 简单题

时间:2022-11-26 10:23:55浏览次数:66  
标签:二分 right target nums LeetCode704 mid 二分法 查找 left

LeetCode代码链接:https://leetcode.cn/problems/binary-search/

题目:给定一个 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

思路

这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。

二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?

大家写二分法经常写乱,主要是因为对区间的定义没有想清楚,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。这里我主要讲解左闭右闭

左闭右闭写法

区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1

例如在数组:1,2,3,4,7,9,10中查找元素2,如图所示(参考代码随想录):

java代码如下:

class Solution {
    public int search(int[] nums, int target) {
        // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1;
        }
        return -1;
    }
}

首先先判断数组以及目标值是否满足要求,然后定义左右两边界,while (left <= right)这句话很重要,接着求mid值,这里不使用(left+right)/2而是left + ((right - left) >> 1)是为了防止数过大而出界。最后就是上述思路进行求解,怎么样是不是很简单?

其实二分法的思路大概是这样,只要掌握了思路,遇到类似的题目都不怕。我们下次题再见!!!

 

标签:二分,right,target,nums,LeetCode704,mid,二分法,查找,left
From: https://www.cnblogs.com/lzdream/p/16926991.html

相关文章

  • 二分查找总结
    二分查找二分查找也常被称为二分法或者折半查找(BinarySearch),每次查找时通过将待查找区间分成两部分并只取一部分继续查找,将查找的复杂度大大减少。对于一个长度为O(n) ......
  • LeetCode 34.在排序数组中查找元素的第一个和最后一个位置
    LeetCode34.在排序数组中查找元素的第一个和最后一个位置题目链接:​​https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/​​......
  • LOJ #6044 题解——完全二分图的生成树计数
    LOJ#6044显然就是要求有多少左边有\(K\)个点,右边有\(N-K\)个点的完全二分图的生成树个数,但是我不会!所以我们想一想怎么算左边\(n\)个点,右边\(m\)个点的完全二分......
  • 每日算法之二维数组中的查找
    JZ4二维数组中的查找描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这......
  • 整数二分查找
    总的来说使用二分的条件:具有单调性注意:二分的思想看似简单,但其实很容易出错整数二分模板以单调递增序列的二分为例给出两个模板:在单调递增序列中找到x或x的后继(大于......
  • SAP-SD-ABAP-VMOD 查找和应用SD模块用户出口(user exit) 好方法
    针对SD模块,有一个专门管理user-exit的开发包 VMOD,只要用tcode:se80查看它,会发现绝大部分的SD要相关的user-exit都能在这找到。......
  • android 隐藏声音文件-不让音乐播放器查找到
    有时候某些程序自带的声音文件,不想被音乐播放找到,如何实现呢?很简单,在需要隐藏的目录下面添加 .nomedia 文件。内容为空即可.可以用vi来添加这个空文件.在超级端下......
  • 一步一步写算法(之字符串查找 中篇)
       昨天我们编写了简单的字符查找函数。虽然比较简单,但是也算能用。然而,经过我们仔细分析研究一下,这么一个简单的函数还是有改进的空间的。在什么地方改进呢?大家可以慢......
  • 一步一步写算法(之字符串查找 上篇)
       字符串运算是我们开发软件的基本功,其中比较常用的功能有字符串长度的求解、字符串的比较、字符串的拷贝、字符串的upper等等。另外一个经常使用但是却被我们忽视的功......
  • 力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回 [-1,-1]......