力扣二分搜索的总结

LeetCode 乘法表中第k小的数(二分搜索) 几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗? 给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。 例 1: 输入: m = 3, n = 3, k = 5 输出: 3 解释: 乘法表: 1 2 3 2 4 6 3 6 9 第5小的数字是 3 (1, 2, 2, 3, 3). 例 2: 输入: m = 2, n = 3, k =... 阅读详情

二分搜索总结

找目标数

有序数组(无重复元素)

力扣704

基本写法

class Solution {
    public int binarySearch(int[] nums, int target) {
        int l = 0, r = nums.length-1;
        while(l <= r ){
            //int mid = l + (r -l)/2;
            int mid = l + (r -l >> 1);
            if(nums[mid] == target){
                return mid;
            }
            else if (nums[mid] < target){
                l = mid + 1;
            }
            else {
                r = mid - 1;
            }
        }
        return -1;
    }
}

力扣35

基本写法

class Solution {
    public int searchInsert(int[] nums, int target) {
        int l = 0;
        int r = nums.length-1;
        while(l <= r){
            int mid = l + (r-l >>2);
            if(nums[mid] == target){
                return mid;
            }
            else if(nums[mid] < target){
                l = mid+1;
            }
            else{
                r = mid-1;
            }
        }
        return l;
    }
}

有序数组(元素可重复)

力扣34

返回第一个(最左)等于target的索引值, 返回最后一个(最右)等于target的索引值

public int binarySearchLeft(int[] nums, int target){
        int l = 0, r = nums.length-1;
        while(l <= r){
            int mid = (l + r)>>>1;
            if(nums[mid] == target){
                if(mid == 0 || nums[mid-1] < target){
                    return mid;
                }
                r = mid - 1;
            }
            else if(nums[mid] > target){
                r = mid - 1;
            }
            else{
                l = mid + 1;
            }
        }
        return -1;
}
 public int binarySearchRight(int[] nums, int target){
        int l = 0, r = nums.length-1;
        while(l <= r){
            int mid = (l + r)>>>1;
            if(nums[mid] == target){
                if(mid == nums.length-1 || nums[mid+1] > target){
                    return mid;
                }
                l = mid + 1;
            }
            else if(nums[mid] > target){
                r = mid - 1;
            }
            else{
                l = mid + 1;
            }
        }
        return -1;
 }

旋转数组(无重复元素)

力扣33

没有重复元素的部分有序数组,搜索旋转排序数组
自己写的

//自己写的
class Solution {
    public int search(int[] nums, int target) {
        int l = 0, r = nums.length-1;
        while(l <= r){
            int mid = (l + r) >>> 1;
            if(nums[mid] == target){
                return mid;
            }
            else if(nums[mid] > target){
                //当l和r之间存在旋转点的时候,且target数值小于左指针的数值时,表示左指针到数组最大值都是无效的,其实这时候应该将l指向最小的那个数,但是无法做到,只能将l++,效率低了一些
                if(nums[r] < nums[l] && target < nums[l]){
                    l++;
                }
                else{
                    r = mid - 1;
                }
            }
            else{
                //当l和r之间存在旋转点的时候,且target数值大于右指针的数值时,表示数组最小值到右指针所指的数都是无效的,其实这时候应该将r指向最大的那个数,但是无法做到,只能将r--,效率低了一些
                if(nums[r] < nums[l] && target > nums[r]){
                    r--;
                }
                else{
                    l = mid + 1;
                }
            }
        }
        return -1;
    }
}

别人的思路

//别人的思路
public int search(int[] nums, int target) {
    int l = 0, r = nums.length - 1;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (nums[mid] == target) {
            return mid;
        }
        // 先根据 nums[mid] 与 nums[l] 的关系判断 mid 是在左段还是右段 
        if (nums[mid] >= nums[l]) {
            // 再判断 target 是在 mid 的左边还是右边,从而调整左右边界 l 和 r
            if (target >= nums[l] && target < nums[mid]) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        } else {
            if (target > nums[mid] && target <= nums[r]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
    }
    return -1;
}

力扣153

寻找旋转排序数组中的最小值 部分有序数组找最小值,不含重复元素

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

旋转数组(元素可重复)

力扣81

有重复元素的部分有序数组(旋转数组)
自己写的,只需要把nums[r] < nums[l] 改为 nums[r] <= nums[l]

//自己写的
class Solution {
    public boolean search(int[] nums, int target) {
        int l = 0, r = nums.length-1;
        while(l <= r){
            int mid = (l + r) >>> 1;
            if(nums[mid] == target){
                return true;
            }
            else if(nums[mid] > target){
                //当l和r之间存在旋转点的时候,且target数值小于左指针的数值时,表示左指针到数组最大值都是无效的,其实这时候应该将l指向最小的那个数,但是无法做到,只能将l++,效率低了一些
                if(nums[r] <= nums[l] && target < nums[l]){
                    l++;
                }
                else{
                    r = mid - 1;
                }
            }
            else{
                //当l和r之间存在旋转点的时候,且target数值大于右指针的数值时,表示数组最小值到右指针所指的数都是无效的,其实这时候应该将r指向最大的那个数,但是无法做到,只能将r--,效率低了一些
                if(nums[r] <= nums[l] && target > nums[r]){
                    r--;
                }
                else{
                    l = mid + 1;
                }
            }
        }
        return false;
    }
}

别人的思路,在上一个题的基础上,用一个if保证左指针指的数和mid指针指的数不相同,否则无法在后面判断mid在前半部分还是后半部分

//别人的思路
class Solution {
    public boolean search(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        while (l <= r) {
            int mid = l + (r - l) / 2;
            if (nums[mid] == target) {
                return true;
            }
            if(nums[l] == nums[mid]){
                l++;
                continue;
            }
            // 先根据 nums[mid] 与 nums[l] 的关系判断 mid 是在左段还是右段 
            if (nums[mid] > nums[l]) {
                // 再判断 target 是在 mid 的左边还是右边,从而调整左右边界 l 和 r
                if (target >= nums[l] && target < nums[mid]) {
                    r = mid - 1;
                } else {
                    l = mid + 1;
                }
            } else {
                if (target > nums[mid] && target <= nums[r]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return false;
    }
}
力扣154

寻找旋转排序数组中的最小值 II,含有重复元素,和之前的处理方法一样

class Solution {
    public int findMin(int[] nums) {
        int l = 0, r = nums.length-1;
        while(l < r){
            int mid = l + (r - l >>1);
            //r--不会错过最小值,因为mid在r前面,两个的值相等,保证后序能判断mid是属于左部分还是右部分
            if(nums[mid] == nums[r]){
                r--;
                continue;
            }
            if(nums[mid] < nums[r]){
                r = mid;
            }
            else{
                l = mid +1;
            }
        }
        return nums[r];
    }
}
LeetCode 安排工作以达到最大的收益(二分搜索) 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益。 现在我们有一些工人。worker[i]是第i个工人的能力,即该工人只能完成难度小于等于worker[i]的工作。 每一个工人都最多只能安排一个工作,但是一个工作可以完成多次。 举个例子,如果3个工人都尝试完成一份报酬为1的同样工作,那么总收益为 $3。如果一个工人不能完成任何工作,他的收益为 $... 阅读详情

相关推荐

FCKeditor 2.6.4 php版本任意文件上传——漏洞复现

一、漏洞描述 FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写。具备功能强大、配置容易、跨浏览器、支持多种编程语言、开源等特点。它非常流行,互联网上很容易找到相关技术文档,国内许多Web项目和大型网站均采用了FCKeditor。 Fckeditor 低于 2.6.4 php 版本任意文件上传漏洞,当您的PHP环境配置为 GPC = Off 时可绕过currentfolder参数过滤上传脚本木马控制网站服务器 二、漏洞原理 漏洞版本:<=2.6.4 三、环境搭建

W小哥 1万+

力扣(leetcode)题目总结——二分法篇

本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目,一共100多道题,每道题都给出了非常详细的解题思路、算法步骤、代码实现。因为力扣题目顺序是随机的,并没有按照算法分类,导致同一类型的算法强化训练不够。所以本系列文章就是来帮你完成算法分类,针对每种算法做强化训练,保证让你以后遇到题目直接秒杀。本篇文章主要是针对二分法相关的算法题,一次性帮你搞定所有二分法题!

weixin_46571171的博客 1615

TC3xx芯片SPI多从机通信避坑指南:AUTOSAR框架下的DMA配置与片选切换

本文针对英飞凌TC3xx芯片在AUTOSAR框架下实现SPI多从机通信的实战难题,提供了详尽的避坑指南。重点解析了如何利用硬件支持的16路片选(SLSO)灵活切换,在AUTOSAR中正确配置不同时序的从设备,并深入探讨了异步模式下DMA的启用条件与关键配置细节,帮助开发者规避通信失败风险,提升系统可靠性。

nn3456的博客 153

力扣——二分查找

二分查找

weixin_74485957的博客 180

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具链中的sgdc约束文件解决跨时钟域(CDC)报错问题。从基础约束文件架构到复杂场景调试,涵盖了时钟域定义、复位信号约束、Waiver策略等关键技巧,并附有常见错误排查方法,帮助工程师高效处理CDC验证挑战。

loss4bartender的博客 1148

【重启后nvidia-smi 命令出现错误】

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

qq_44769377的博客 5210

【刷题笔记】二分查找

秋招刷题笔记。根据【代码随想录】的教程结合自己的理解整理的。

Wen1104371359的博客 367

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 944

力扣——二分专题

文章目录前言一、基础二分1.搜索插入位置[简单]问题题解2.寻找旋转排序数组中的最小值[中等]问题题解3 .寻找旋转排序数组中的最小值II[困难]问题题解4 .搜索旋转排序数组[中等]问题题解5 .搜索旋转排序数组II[中等]问题题解6.供暖气[中等]问题题解 前言 本文主要整理了力扣上面的使用二分的题型,由易到难。 一、基础二分 1.搜索插入位置[简单] 搜索插入位置 问题 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。必须使用时

qq_44074143的博客 1080

面向 ABAP 开发者的 Joule 实战:把 AI 带进 Eclipse 的每一次敲键

本文介绍了SAP推出的ABAP开发AI工具套件Joule for developers,重点解析了其代码补全、自然语言对话、代码解释、测试生成等功能如何融入ABAP Cloud开发全流程。文章提供了具体的使用场景和操作示例,包括RAP应用开发中的建模辅助、代码理解、测试生成等环节,并分享了实用的提示词模板。同时强调了启用授权等实施细节,帮助开发者将AI能力转化为实际生产力而非演示效果。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 459

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9884

关于二分查找的一些总结

最近二十天基本上在复习算法和数据结构,对其中一些力扣做了一些总结,今天将二分查找法的应用总结一下: 基本上分为三种类型: 1、 在排序数组中,找某个值,属于常规的二分查找法的应用 // 这里写一下 二分查找法在一有序数组中找某个值,并返回其下标; int find_the_index(int arr[],int start,int end,int target) //在arr数组中,从下标start到end中找值为target的数 { if(start>end)return -1; //代表返

weixin_43527115的博客 288

ESP32学习笔记06-UART 的485 通讯模式

通信方式选择UART 控制器支持多种通信模式,使用函数 uart_set_mode() 可以选择模式。选择特定模式后,UART 驱动程序将处理已连接 UART 设备的相应行为。例如,主机开始向 Tx FIFO 缓冲区写入数据时,UART 驱动程序会自动置位 RTS 管脚(逻辑 1);最后一位数据传输完成后,驱动程序就会取消置位 RTS 管脚(逻辑 0)。要使用此模式,软件。

Car12 2476

算法小白力扣刷题记录【二分搜索】

算法小白刷题记录,欢迎指正,共同进步。

danaaaa的博客 608

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Leetcode 59 二分搜索

左边界:找到目标后收缩右边界(),向左逼近右边界:找到目标后收缩左边界(left=mid+1),向右逼近边界检查:循环终止后需验证结果的有效性,避免误判你提供的代码完美契合「左闭右闭」范式,逻辑严谨,只需注意边界检查的完整性,即可通过所有测试用例。这种解法时间复杂度最优,是面试中的标准解法,掌握后可应对所有「二分找边界」类问题。利用 C++ 的列表初始化语法,快速构造一个包含两个边界值的临时对象;函数返回这个单一的 vector 对象,间接实现 “返回多个结果” 的需求;

im_AMBER的博客 971

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【二分搜索】Java实现与习题总结

二分搜索 参考内容:https://greyireland.gitbook.io/algorithm-pattern/ji-chu-suan-fa-pian/binary_search 给一个有序数组和目标值,找第一次/最后一次/任何一次出现的索引,如果没有出现返回-1 模板四点要素 初始化:start=0、end=len-1 循环退出条件:start + 1 < end 比较中点和目标值:A[mid] ==、 <、> target 判断最后两个元素是否符合:A[start]、A[end

littlephil的博客 538

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Leetcode百题斩-二分搜索

二分搜索也是一个很有趣的专题,被做过的题中,刚好一个Easy,一个Medium和一个Hard,刚好可以看看,二分搜索的三个难度等级都是啥样的。

Owen_Q的博客 1159

LeetCode_二分搜索_简单_35.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。

代码星辰的博客 346

二分搜索算法(以力扣周赛“每个小孩最多分到多少糖果”为例)

上午刚刚打完力扣周赛,感觉心有余而力不足,好多次都有这么一种差一点就AC的感觉,所以归根结底还是自己基础不牢的缘故,借着有感记录下二分搜索算法的解法,也祭奠下自己第287场周赛的再次失败! 二分搜索算法的关键在于: (1)定义好左、右侧边界,左侧边界是否包含,右侧边界是否包含。 (2)考虑好while循环条件,是在left<right还是left<=right。 (3)根据(1)中左、右侧边界是否包含的设置,在收缩的过程中处理好加一,减一的问题。 强烈推荐如下的二分搜索算法模板,:

smartfoolish的博客 691

数据结构与算法以及leetcode刷题 012 二分搜索树

今天刷题的内容是二分搜索树的内容;首先是二分搜索树的概念:二分搜索树是一种高效的二叉树,任何结点的左结点都小于根节点,右节点都大于根节点;具有高效的find功能;二分搜索树的使用在leetcode中也有不少题,下面就对相应的二分搜索树的内容做yield归纳:leetcode235:求一个二分搜索树的最近的公共父亲结点; 使用递归来进行实现算法;class Solution { public: ...

hufanglei007的博客 404

[二分搜索] leetcode 1146 Snapshot Array

problem:https://leetcode.com/problems/snapshot-array/ 这道题暴力做(把所有快照都存下来)会超出空间限制,因此需要减少使用空间,两次快照直接没有改变的值就无需重复记录。可以使用二分搜索,每次修改值的时候记录一下当前快照的值,然后每次查找当前下标特定快照id时的值时,查找小于等于这一快照id对应的值即可。 clas...

ayzejx8547408的博客 169

前端工程师的 LeetCode 之旅 -- 二分搜索算法(Easy篇)

一、二分搜索算法 1、简介   二分搜索是一种在有序数组中查找某一特定元素的搜索算法。   二分搜索算法的时间复杂度为 O(log n),相比较顺序搜索的 O(n) 时间复杂度,它要快很多。   例如,在一个长度为一百万的有序数组中,采用顺序搜索,最坏的情况需要执行一百万次,而二分搜索算法只需要二十次!   从上图,读者可以很容易发现,二分搜索的关键就是通过目标值与中间值的比较,将搜索区间缩小一...

descire 394

力扣labuladong一刷day24天

一样是先确定left和right的边界,边界里的数是船的容量,不可能说船的容量装不下某一个货物,故left应该是所有货物中的最大值。f(mid) 与 k如何调节,其实直接分析就行,怎么写都可以,加入写成f(mid) <= k 那么说明船容量太大,导致天数少了,所以缩小容量天数就大了,即right = mid -1;思路:本质上是一个二分搜索左边界的问题,每个小时吃多少都可以,要找的是每小时吃k个,h个小时正好吃完,抽取出来计算用多少小时吃完的函数,小时数超了应该扩大k,小时数少了应该缩小k。

qq_43511039的博客 734

[二分搜索] leetcode 875 Koko Eating Bananas

problem:https://leetcode.com/problems/koko-eating-bananas/ 二分搜索的一个主要难点在于确定搜索的空间。比较容易有思路的问题类型是对于已经排好序的数组查找特定数据,使用下标作为二分的搜索对象即可。 另一种稍微有一点难度的是对所有可能的解在[minVal, maxVal] 区间进行二分搜索,判断当前...

ayzejx8547408的博客 111

Leetcode 60 抽象应用二分搜索

这个版本完全去掉了 Lambda 语法,用基础的「独立成员函数」实现判断逻辑,同时严格遵循你之前学习的左闭右开搜索框架(区间定义、循环条件、边界收缩、返回值都不变),既保留了原框架的核心思想,又降低了语法理解难度,适合新手巩固二分搜索的基础用法。初始化区间:覆盖所有可能的速度;二分循环:通过中点试错,快速缩小范围;判断函数:精准计算时间,提前退出优化;边界收缩:遵循左闭右开规则,确保找到最小解。区间是,right = 最大可能解 + 1;循环条件。

im_AMBER的博客 1022

前端工程师的 LeetCode 之旅 -- 二分搜索算法 Medium 篇(上)

一、前言   错过上一篇的小伙伴们,可以先阅读前端工程师的 LeetCode 之旅 – 二分搜索算法 Easy 篇,了解一下二分搜索算法的实现原理以及如何利用 JavaScript 语言实现该算法。   二分搜索算法本身并不是特别复杂,核心点主要集中在: 有序数组:指的是一个递增或者递减的区间(特殊情况如:【852. 山脉数组的峰顶索引】); 中间数:用来确定搜索目标落在左半区间还是右半区间; ...

descire 362
上一篇: Ubuntu pyenv: pip: command not found错误
下一篇: 海外知网网址
PMPWDF
博客等级 码龄10年 44粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值