【算法】——二分查找合集

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

零:二分查找工具

1:最基础模版

2:mid落点问题

一:最简单的二分

二:查找元素的位置(可能会有多个)

三:搜索插入位置

四:x的平方根

五:山脉数组的峰顶索引

六:寻找峰值

​编辑

解法一

解法二

 七:点名


零:二分查找工具

1:最基础模版

mid的写法可以防止溢出

2:mid落点问题

巧妙记忆:循环条件为while(left<right)时,left = mid,想象一下,只剩下两个球,那么我们的mid只能落在右端点,否则left = mid 会造成 left < right 死循环,此时我们确定的是右边的界限

重点:left 和right 根据题目的意思进行设置,然后才是mid的设置根据left和right的设置而设置(这才是这个二分查找的精髓所在)

简单记忆:落在哪个端点确定哪个界限

一:最简单的二分

704. 二分查找 - 力扣(LeetCode)

class Solution {
    public int search(int[] nums, int target) {
        //mid=left + (right - left)/3
        //用left移动思想来确定mid的位置,这种写法可以防溢出
        int left = 0 , right = nums.length-1 , mid = (left+right)/2;
        while(left<=right){
            if(nums[mid] < target){
                left = mid + 1 ;
                mid = (left+right)/2;
            }else if(nums[mid] > target){
                right = mid - 1;
                mid = (left+right)/2;
            }else{
                return mid;
            }
        }
        return -1;
    }
}

二:查找元素的位置(可能会有多个)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] result = new int[]{-1,-1};
        if(nums.length == 0 ){
            return result;
        }
        //左端点
        
        int left = 0 , right = nums.length-1 ,targetLeft = 0 , targetRight = 0;
        while(left < right){
            int mid = left + (right - left )/2;
           if(nums[mid] < target){
                left = mid + 1;
           }else{
                right = mid;
           }
        }
        targetLeft = left;
        left = 0 ; right = nums.length-1 ;

        //右端点
        while(left < right){
            int mid = left + (right-left+1)/2;
            if(nums[mid] > target){
                right = mid - 1;
            }else{
                left = mid;
            }
        }
        targetRight = right;


        if(nums[targetLeft] != target){
            return result;
        }else if(nums[targetLeft] == nums[targetRight]){
            result[0] = targetLeft;
            result[1] = targetRight;
            return result;
        }else{

        }
        
        return result;
    }
}

三:搜索插入位置

35. 搜索插入位置 - 力扣(LeetCode)

class Solution {
    public int searchInsert(int[] nums, int target) {
        if(nums.length == 0){
            return 0;
        }
        int targetLeft = 0  , n = nums.length;
        int left = 0 , right = nums.length-1;
        //这道题只用找一个左界限就够了
       
        //左界限
        left = 0 ; right = n-1;
        while(left < right){
            int mid = left + (right - left)/2;//左端点
            if(nums[mid] >= target){
                right = mid;
            }else{
                left = mid + 1;
            }
        } 
        targetLeft = left;


        int result = 0;
        
            
            if(target > nums[targetLeft]){
                result = targetLeft + 1;
            }else{
                result = targetLeft ;
            }


        
       
        
        return result;
    }
}

四:x的平方根

69. x 的平方根 - 力扣(LeetCode)

class Solution {
    public int mySqrt(int x) {
        long left = 0 , right = x ;
        if(x < 1 ){
            return 0;
        }
        long mid = 0;//mid的平方越界了
       while(left < right){
            mid = left + (right - left + 1)/2;
            if(mid * mid <= x){
                left = mid;
            }else{
                right = mid - 1 ;
            }
       }
       return (int)left;//强转为int类型
    }
}

五:山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left = 0 , right = arr.length , n = arr.length;
        while(left < right){
            int mid = left + (right - left + 1)/2;
            if(arr[mid] > arr[mid-1]){
                left = mid;
            }else if(arr[mid] < arr[mid-1]){
                right = mid - 1;
            }else{
                
            }
        }
        return left;
    }
}

六:寻找峰值

162. 寻找峰值 - 力扣(LeetCode)

解法一

class Solution {
    public int findPeakElement(int[] nums) {
        int left = 0 , right = nums.length-1;
        //如果数组中只有一个元素,while循环都进不去,规避了这个问题nb
        while(left < right){
            int mid = left + (right - left )/2;
            if(nums[mid+1] > nums[mid]){
                left = mid + 1;
            }else if(nums[mid+1] < nums[mid]){
                right = mid;
            }else{

            }
        }
        return left;
    }
}

解法二

class Solution {
    public int findPeakElement(int[] nums) {
        //暴力解法
        int n = nums.length , result = 0;
        if(n == 1){
            result = 0;
        }else if(nums[0] > nums[1]){
            result = 0;
        }else if(nums[n-1] > nums[n-2]){
            result = n-1;
        }else{
            int left = 0 , right = nums.length ;
            while(left < right){
                int mid = left + (right - left + 1)/2;
                if(nums[mid] > nums[mid-1]){
                    left = mid;
                }else if(nums[mid] < nums[mid-1]){
                    right = mid-1;
                }else{
                }
            }
            result = left;
        }
        return result;
    }
}

七:寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值

class Solution {
    public int findMin(int[] nums) {
        int left = 0 , n = nums.length , right = n-1;
        int tem = nums[n-1];
        while(left < right){
            int mid = left + (right - left)/2;
            if(nums[mid] <= nums[n-1]){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return nums[left];
    }
}

 七:点名

LCR 173. 点名 - 力扣(LeetCode)

class Solution {
    public int takeAttendance(int[] records) {
        int left = 0 , n = records.length , right = records.length-1;
        if(records[0] != 0){
            return 0;
        }
        if(records[n-1] == n-1){
            return n;
        }
        while(left < right){
            int mid = left + (right - left)/2;
            if(records[mid] - mid <= 0){
                left = mid + 1;
            }else{
                right = mid ;
            }
        }
        return right;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/915111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。 二、常见的数据结构 &#xff08;一&#xff09;栈 特点&…

Windows快速部署并使用GitHub上Swift项目

1.科学上网 2.找到项目&#xff0c;release部分&#xff0c;下载最新版的ZIP文件&#xff0c;并且打开&#xff0c;解压。 3.打开cmd&#xff0c;使用你做项目用的虚拟环境&#xff0c;安装必须安装的包文件 pip install ms-swift[llm] -U 类似这样子唰唰唰一堆安装好之后&am…

C++ | Leetcode C++题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; class Solution { public:static constexpr int MOD 1000000007;vector<vector<long>> pow(vector<vector<long>> mat, int n) {vector<vector<long>> ret {{1, 0, 0, 0, 0, 0}};while (n > 0) {…

【精读】Kinodynamic Trajectory Optimization and Control for Car-Like Robots

原来阅读这个板块是我用来写小说灵感和摘抄笔记的&#xff0c;但是CSDN总说我重复率太高&#xff0c;mad以后改用来精读论文了 每天都在写不同的文章&#xff01;为什么&#xff1f;主要还是自我的研究进度跟不上课题组的进度 先给自己点根蜡烛11.15就开组会了我还没读完 ho…

学Linux的第八天

目录 管理进程 概念 程序、进程、线程 进程分类 查看进程 ps命令 unix 风格 bsd风格 GNU风格 top命令 格式 统计信息区 进程信息区&#xff1a;显示了每个进程的运行状态 kill命令 作用 格式 管理进程 概念 程序、进程、线程 程序&#xff1a; 二进制文件&…

uniCloud云对象调用第三方接口,根据IP获取用户归属地的免费API接口,亲测可用

需求 在2022年5月初&#xff0c;网络上各大平台上&#xff0c;都开始展示用户IP属地&#xff0c;在某音、某手等小视频平台以及各主流网站应用中&#xff0c;都展示IP归属地&#xff0c;如下图所示&#xff1a; 解决办法 收费文档的肯定有很多&#xff0c;基本你百度搜“归…

Leetcode - 143双周赛

目录 一&#xff0c;3345. 最小可整除数位乘积 I 二&#xff0c;3346. 执行操作后元素的最高频率 I 1.差分数组 2.同向三指针 滑动窗口 三&#xff0c; 3348. 最小可整除数位乘积 II 一&#xff0c;3345. 最小可整除数位乘积 I 本题直接暴力枚举&#xff0c;题目求 >n…

VS2022项目配置笔记

文章目录 $(ProjectDir&#xff09;与 $(SolutionDir) 宏附加包含目录VC目录和C/C的区别 $(ProjectDir&#xff09;与 $(SolutionDir) 宏 假设有一个解决方案 MySolution&#xff0c;其中包含两个项目 ProjectA 和 ProjectB&#xff0c;目录结构如下&#xff1a; C:\Projects\…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress是一个基于React框架开发的开源发布平台&#xff0c;它不仅仅是一个简单的博客系统&#xff0c;更是一个功能全…

[编译报错]ImportError: No module named _sqlite3解决办法

1. 问题描述&#xff1a; 在使用python进行代码编译时&#xff0c;提示下面报错&#xff1a; "/home/bspuser/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py", line 18, in <module>import sqlite3File "/usr/local/lib/python2.7/sqlite3/_…

信号量和线程池

1.信号量 POSIX信号量&#xff0c;用与同步操作&#xff0c;达到无冲突的访问共享资源目的&#xff0c;POSIX信号量可以用于线程间同步 初始化信号量 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem&#xff1a;指向sem_t类…

泷羽sec学习打卡-Linux基础2

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 关于Linux的那些事儿-Base2 一、Linux-Base2linux有哪些目录呢&#xff1f;不同目录下有哪些具体的文件呢…

【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局

Android XML 约束布局 参考 TextView居中 TextView 垂直居中并且靠右 TextView 宽高设置百分比 宽和高的比例 app:layout_constraintDimensionRatio"h,2:1" 表示子视图的宽高比为2:1&#xff0c;其中 h表示保持宽度不变&#xff0c;高度自动调整。 最大宽度 设…

使用HTML、CSS和JavaScript创建动态圣诞树

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

golang分布式缓存项目 Day1 LRU 缓存淘汰策略

注&#xff1a;该项目原作者&#xff1a;https://geektutu.com/post/geecache-day1.html。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 LRU缓存淘汰策略 三种缓存淘汰策略 FIFO&#xff08;First In, First Out&#xff09;先进先出 原理&…

面向对象的需求分析和设计(一)

[toc] 1. 引言 前一篇文章《我对需求分析的理解》提到了面向对象分析和设计&#xff0c;正好最近又重新有重点的读了谭云杰著的《Think in UML》&#xff0c;感觉有必要写把书中一些核心内容观点以及自己的想法整理出来&#xff0c;一是方便自己日后的复习&#xff0c;另外也…

php中ajax怎么使用【小白专用24.11.12】

在PHP中&#xff0c;使用Ajax可以实现页面异步加载和动态数据交互。下面是使用Ajax的基本方法&#xff1a; <?php // ajax_endpoint.php// 处理请求&#xff0c;并返回JSON格式的响应 $responseData array(message > Hello from PHP!); header(Content-Type: applicati…

【css】html里面的图片宽度设为百分比,高度要与宽度一样

场景&#xff1a;展示图片列表的时候&#xff0c;原始图片宽高不一致。 外层div的宽度自适应&#xff0c;图片宽度不能固定数值&#xff0c;只能设置百分比。图片高度也不能设置固定数值。 如何让图片的高度与图片的宽度一样呢&#xff1f; html代码 &#xff1a; <div cl…

开源项目推荐——OpenDroneMap无人机影像数据处理

实景三维作为GIS最火的课题&#xff0c;最近在想做一套自己的三维构建工具&#xff0c;考察了几个开源项目&#xff0c;把自己的搜索过程用csdn记录下来&#xff0c;希望也能帮助到各位同仁。 OpenDroneMap&#xff08;ODM&#xff09;是一个开源项目&#xff0c;旨在处理无人…

快速提升ROI,收藏这份Facebook广告投放技巧!

Facebook广告在海外数字营销中占据重要地位。据统计&#xff0c;约有 700 万广告商活跃在该平台上&#xff0c;购买力不容小觑。 然而&#xff0c;当前 Facebook 广告竞争激烈&#xff0c;导致广告位供不应求&#xff0c;成本上升&#xff0c;尤其是在下半年营销旺季中&#xf…