首页 > 其他分享 >LeetCode704. 二分查找

LeetCode704. 二分查找

时间:2023-10-12 22:47:40浏览次数:26  
标签:二分 target nums int LeetCode704 mid high 查找 low

描述

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

提示:

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

第一次提交:

class Solution {
    public int search(int[] nums, int target) {
        int low = 0;
        int high=nums.length-1;
        while(low<=high){
            int mid=(low+high)/2;
            int midValue=nums[mid];
            if(midValue==target)return mid;

            if(midValue<target)low=mid+1;
            else high=mid-1;
        }
        return -1;
    }
}

结果

刚开始以为自己的解法吃内存太多了,后来用了别人写的的优质代码发现内存占用都差不多:)

学习到的点

二分查找有两种写法,以往虽然知晓,但是大脑中没有一个明确而界限点

  1. 左闭右闭[low high],即target是存在于low high这两个索引对应值的之中
  • while(low<=high)是有意义的
  • 当midValue>target的时候,high=mid-1 low=mid+1
  1. 左闭右开[low high),即target是存在于low索引对应的值的右边(包括low自己)而小于high对应索引值的左边的
  • while(low<=high)没有意义,所以为low<high
  • 当midValue>target的时候,high=mid,此时low=mid+1
    以下为大佬的优质解法:
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;
    }
}
1.
if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
}
这一步很重要,如果条件通过则可以避免执行下面的代码,提升代码性能

2.
int mid = left + ((right - left) >> 1);
向右移动1位为除2(开发做久了,唤醒了沉睡的记忆)
让low右移low和high这段距离的二分点得到mid(B格提升)

标签:二分,target,nums,int,LeetCode704,mid,high,查找,low
From: https://www.cnblogs.com/whitePuPigeon/p/17760777.html

相关文章

  • 【二分图】第1幕:初识
    二分图的概念第1幕·第1场·二分图的概念定义若有一个无向图,其所有节点可以被分为两个不相交的非空集合,且同一集合中的点之间没有边,那么称该图为二分图。形式化地,对于一张图\(G=\{V,E\}\),若有集合\(A,B\)满足:\((A,B\subseteqV)\and(A\capB=\emptyset)=1\)\(\fora......
  • 王道408---DS---查找
    基本概念ASL平均查找长度在查找过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字的比较次数的平均值顺序查找与折半查找一般线性表的顺序查找没啥好说的有序表的顺序查找树中的圆形结点表示有序线性表中存在的元素;树中的矩形结点......
  • 双for循环+grep实现批量查找文件内容
     [root@localhostweihu1]#cattest.txt/etc/nginx/conf/wwwblackip.conf/etc/nginx/bss_acl/bss_acl.conf/etc/nginx/conf/whiteip.conf/etc/nginx/conf/apiwhitelist.conf/etc/nginx/api_acl/api_acl.conf[root@localhostweihu1]#catip.txt121.40.157.124124.70.195.3......
  • 二分答案作题心得
    使用洛谷P1873举例看出这个题目考的是二分答案找出题目横纵坐标,横坐标是我们要输出的东西(也是L和R),纵坐标是输入的m,理解题目,观察横纵坐标的递增递减关系这个题目里面输入的m是所得到的木材,横坐标是锯片的高度,锯片越高得到的木材越少,所以是递减关系开始写二分模板,写check函......
  • 计算机程序设计艺术(第3卷)-排序和查找(英文影印版) pdf电子版epub
    计算机程序设计艺术(第3卷)-排序和查找(英文影印版)pdf电子版epub作者: (美)DonaldE.KnuthISBN: 9787302058168点击下l载数学分析算法,没有比这更好的了......
  • 查找一个表中存在而另一个表中不存在的记录
    例如:两个表:t1,t2,查询在表t1中存在,而在表t2中不存在的记录。     假设以id字段为关联字段。方法1:需要两个表的字段完全一致select*fromt1minusselecct*fromt2方法2:select*fromt1wherenotexists(select1fromt2wheret1.id=t2.id)方法3:select*fromt1......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    704.二分查找链接:https://leetcode.cn/problems/binary-search/description/思路:关键是定义清楚区间边界,想清楚middle在计算中是否可能取到左边界or右边界。若采用闭区间,则middle可能等于左/右边界值。27.移除元素链接:https://leetcode.cn/problems/remove-element/思路:暴......
  • 二分查找(整数二分)
    一、算法简介二分法,即二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法。例如,如果一个序列是有序的,那么可以通过二分的方法快速找到所需要查找的元素,相比线性搜索要快不少。此外二分法还能高效的解决一些单调性判定的问题。二分的关键不在于单调性,或者说二......
  • 代码随想录算法训练营第一天(python) | 704. 二分查找、27. 移除元素。
    Leetcode704二分查找题目链接:704二分查找关键点思路:1、是否要进入到while部分的代码是left<=right还是left<right,看[left,right]是否是合法区间.例如[1,1]是合法区间,取<=;[1,1)非合法区间,取<。2、缩小区间时,考虑边界是否已经比较过。左闭右闭区......
  • C++黑马程序员——P223-226. set容器 构造和赋值,大小和交换,插入和删除,查找和统计
    P223.set容器——构造和赋值P224.set容器——大小和交换P225.set容器——插入和删除P226.set容器——查找和统计P223.set容器构造和赋值特点:所有元素都会在插入时自动被排序本质:set/multiset属于关联式容器,底层结构是用二叉树实现。set和multiset的区别set不......