【剑指offer刷题记录 java版】数组双指针 之 二分搜索

news2024/11/19 5:30:20

本系列文章记录labuladong的算法小抄中剑指offer题目


【剑指offer刷题记录 java版】数组双指针 之 二分搜索

  • 剑指 Offer 53 - I. 在排序数组中查找数字 I
  • 剑指 Offer II 068. 查找插入位置
  • 剑指 Offer 04. 二维数组中的查找
  • 剑指 Offer II 069. 山峰数组的顶部
  • 剑指 Offer II 073. 狒狒吃香蕉(难)
  • 剑指 Offer 53 - II. 0~n-1中缺失的数字
  • 总结


剑指 Offer 53 - I. 在排序数组中查找数字 I

题目链接:https://leetcode.cn/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/
在这里插入图片描述

class Solution {
    public int search(int[] nums, int target) {
        int mid = erfen(nums,target);
        //未找到等于target的下标,返回0
        if(mid==-1)return 0;

        //向两边寻找边界并计数
        int left=mid,right=mid;
        int count=1;
        while(--left>=0 && nums[left]==target)count++;
        while(++right<nums.length && nums[right]==target)count++;
        return count;
    }
    
    //二分搜索
    public int erfen(int[] nums, int target){
        int left=0,right=nums.length-1;//左闭右闭
        int mid;
        while(left<=right){
            mid = (left+right)/2;
            if(nums[mid]<target){
                left=mid+1;
            }else if(nums[mid]>target){
                right=mid-1;
            }else{
                return mid;
            }
        }
        return -1;
    }
}

剑指 Offer II 068. 查找插入位置

题目链接:https://leetcode.cn/problems/N6YdxV/description/
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int searchInsert(int[] nums, int target) {
        //因为1 <= nums.length <= 10^4,不需要判空
        // if(nums.length==0)return 0;
        
        int left=0, right=nums.length-1;//左闭右闭
        int mid=0;
        while(left<=right){
            mid=(left+right)/2;
            if(nums[mid]<target){
                left=mid+1;
            }else if(nums[mid]>target){
                right=mid-1;
            }else{
                return mid;
            }
        }
        return left;
    }
}

剑指 Offer 04. 二维数组中的查找

题目链接:https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/
在这里插入图片描述

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        //从右上角或者左下角出发,保证两个方向一个增大一个减小
        // 这样避免了采用动态规划的穷举
        int m=matrix.length-1,n=0;//从左下角出发
        while(m>=0 && n<matrix[0].length){
            if(matrix[m][n]>target){
                m--;
            }else if(matrix[m][n]<target){
                n++;
            }else{
                return true;
            }
        }
        return false;
    }
}

剑指 Offer II 069. 山峰数组的顶部

题目链接:https://leetcode.cn/problems/B1IidL/
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int peakIndexInMountainArray(int[] arr) {
        int left=0,right=arr.length-1;//左闭右闭
        // 因为题目必然有解,所以设置 left == right 为结束条件
        while(left<right){
            int mid = (right+left)/2;
            if(arr[mid]<arr[mid+1]){
                // mid+1 本身就是峰值或其右侧有一个峰值
                left=mid+1;
            }else{
                right=mid;
            }
        }
        return left;
    }
}

剑指 Offer II 073. 狒狒吃香蕉(难)

题目链接:https://leetcode.cn/problems/nZZqjQ/
在这里插入图片描述

class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        /**
        本题的非严格单调数组没有显示表示,需要自己定义
        可以发现,肥狒狒能吃掉全部香蕉的时间 getTime(k) 随着 吃香蕉速度k 增大而增大
        因此可以将吃香蕉速度看作下标,吃掉全部香蕉的时间为数组元素
        本题转换为寻找数组中小于等于给定时间h的最大下标
         */
        int left=1,right=1000000000;//左闭右闭
        while(left<=right){
            int mid = (left+right)/2;
            if(getTime(mid,piles)>h){
                left=mid+1;
            }else if(getTime(mid, piles)<=h){
                right=mid-1;
            }
        }
        return left;

    }

    // 定义:速度为 k 时,需要 getTime(k) 小时吃完所有香蕉
    public int getTime(int k, int[] piles){
        int time=0;
        for(int i=0;i<piles.length;i++){
            time += piles[i] / k;
            if (piles[i] % k > 0) {
                time++;
            }
        }
        return time;
    }
}

剑指 Offer 53 - II. 0~n-1中缺失的数字

题目链接:https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/
在这里插入图片描述

class Solution {
    public int missingNumber(int[] nums) {
        int left=0,right=nums.length-1;
        int mid=0;
        while(left<=right){
            mid=(left+right)/2;
            if(nums[mid]>mid){
                right=mid-1;
            }else if(nums[mid]==mid){
                left=mid+1;
            }
        }
        return left;//这里巧妙地使用下标替换数组值,避免了下标超范围的问题
    }
}

总结

二分查找建立在有序的和基础上,复杂度是O( log(n) )。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java周期性线程池newScheduledThreadPool介绍,多线程下载url文件(断点下载、进度展示、网速展示、剩余时间展示)

文章目录 一&#xff1a;newScheduledThreadPool&#xff08;周期性线程池&#xff09;1.1 特点1.2 核心线程数1.3 创建实例1.4 常用方法1.4.1 schedule方法1.4.2 scheduleAtFixedRate方法1.4.3 scheduleWithFixedDelay方法 二&#xff1a;多线程下载展示文件总大小、剩余时间、…

基于SpringBoot+vue的简历系统设计和实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

基于SSM的养老机构信息管理系统设计与实现

摘 要 随着我国老年人逐渐增加&#xff0c;老人们的子女数量减少&#xff0c;工作时间过长无暇照顾父母&#xff0c;导致养老院和护工需求量大幅上涨。伴随我国生活水平提高的同时对老年人的护工人员的要求也越来越高。根据以上要求关于养老院有很多的信息需要进行管理&#…

Zero-Shot, One-Shot, and Few-Shot Learning概念介绍

导语 本文将介绍零样本学习、一次样本学习和少样本学习的概念&#xff0c;它们使得机器学习模型能够在仅有有限数量的示例情况下对对象或模式进行分类和识别。 在机器学习中&#xff0c;我们通常需要大量的训练数据来训练模型&#xff0c;以便它能够准确地识别和分类新的输入…

数据挖掘知识与学习方向

数据挖掘是一门涉及多个学科的交叉学科&#xff0c;需要掌握的知识点也比较多。以下是一些数据挖掘的基础知识和学习方向&#xff1a; 数据库&#xff1a;需要掌握 SQL 语言和数据库设计&#xff0c;以便能够有效地管理和处理数据。 统计学&#xff1a;需要掌握基本的统计学知…

硬盘初始化后数据还能恢复吗?硬盘被初始化怎么恢复数据

现今热门的数据恢复话题之一便是硬盘被初始化后如何恢复数据。或许许多人都遭遇过这一问题&#xff0c;往往因为误操作或不小心&#xff0c;导致硬盘数据被不可逆地清除。所以&#xff0c;为帮助广大用户避免数据丢失的情况&#xff0c;本文将为大家介绍如何恢复被初始化的硬盘…

基于注解的Spring(IOC+AOP)

目录 这是基于黑马Spring的笔记 写再前面 开始 Component(valuebean的名称) componet衍生出的3个注解 Bean内部的属性进行注入 非自定义的Bean管理 使用配置类完全替代XML配置文件 配置类中的注解 spring中的其他注解&#xff08;偶尔会用到) Spring注解的解析原理 sp…

Java Supervisor RPC2 接口对接

1.引入xmlrpc-client 如果是C#语言&#xff0c;请参考《C#对接supervisor XML-RPC API 实现进程控制》 如何安装Supervisor&#xff0c;请参考《Linux进程守护—Supervisor&#xff08;ubuntu&#xff09;》 如果是Maven项目&#xff0c;则在pom.xml引入jar包 <dependenc…

详解CSS中的flex布局

详解CSS中的flex布局 1、概念2、容器属性2.1 flex-direction2.2 flex-wrap2.3 flew-flow2.4 justify-content2.5 align-items2.6 align-content 3、元素属性3.1 order3.2 flex-grow3.3 flex-shrink3.4 flex-basis3.5 flex3.6 align-self 1、概念 弹性盒子&#xff08;display: …

如何系列 JMeter如何录制脚本

文章目录 方式1. 手动编写2. JMeter自带录制功能3. Fiddler录制4. Badboy录制5. Blazemeter录制 总结和使用感受 方式 1. 手动编写 最原始的方式&#xff0c;在线程组中根据研发提供的接口文档和浏览器的Network请求一个个手动录入&#xff0c;它可以提供更大的灵活性和控制力…

PostgreSQL 中的虚拟文件描述符

由于每个操作系统限制了一个进程能打开的文件数&#xff08;例如&#xff1a;ubuntu 为1024&#xff09;&#xff0c;因此进程能获得的文件描述符是有限的。对于经常需要打开许多文件的数据库进程来说&#xff0c;很容易会超过操作系统对于文件描述符数量的限制。 为解决这个问…

如何写好一份解决方案

1、前言 我们在日常工作中会不可避免要去编写各种方案&#xff0c;如技术方案、建设方案、项目建议书、实施方案、规划方案、解决方案等。 我们去浏览华为、阿里、腾讯、IBM、海尔等公司的官网&#xff0c;可以看到在首页比较显眼的位置&#xff0c;都有解决方案的入口&#…

Postcat X APISIX 合作插件 :一键同步,轻松配置到 APISIX

近日&#xff0c;云流科技&#xff08;广州&#xff09;有限公司&#xff08;简称“Eolink”&#xff09;旗下的开源 API 管理工具 Postcat 和深圳支流科技有限公司&#xff08;简称“API7 支流科技”&#xff09;在各自擅长的领域携手合作&#xff0c;推出了 Postcat & Ap…

R语言 tidyverse系列学习笔记(系列4)PlantGrowth - percentage table

本篇学习数据分析&#xff0c; Excel 表格制作 Task&#xff1a; 创建一个 行 百分比 表格 row percentage table 先看一下 PlantGrowth 数据集 library(dplyr)data("PlantGrowth") view(PlantGrowth)给数据集新加一列 weight_cat &#xff0c;并用 case_when 自定…

【React】: React的生命周期

概述 生命周期的每个阶段总是伴随着一些方法的调用&#xff0c;这些方法就是生命周期的钩子函数 钩子函数的作用&#xff1a;为开发人员在不同操作阶段提供了十几 只有 类组件 才有生命周期 生命周期的图片&#xff1a; 同时有&#xff1a; 1.1 创建时 的生命周期执行顺序 编写…

计划任务使用介绍

作者:lly 文章目录 前言一、使用说明1.1 发布模型1.2 创建并设置计划任务1.3 开启计划任务1.4 管理计划任务 二、结语 前言 iServer 11i(2023)对于处理自动化服务新增计划任务功能&#xff0c;该功能支持定时触发和监听文件变化触发执行模型&#xff0c;因此计划任务适用于以下…

Vite构建工具下Tinymce踩坑指南

背景 "vue": "^3.2.41","vite": "^3.2.3","tinymce": "^6.4.2","tinymce/tinymce-vue": "^5.1.0",坑1: 找不到zh-Hans.js等配置的文件 使用Tinymce需要配置中文汉化包、样式等。这些文件都是…

安全问题我们需要重视,立刻升级fastjson2

一、前言 小伙伴大家好&#xff0c;我是开源字节快速开发平台的作者。fastjson2.0 是fastjson的重要升级&#xff0c;目标是为下一个十年提供一个高性能的JSON库&#xff0c;同一套API支持JSON/JSONB两种协议。 近期fastjson 再报安全漏洞&#xff0c;直接给我们发送了高危告…

FastReport 2023.2新版, Delphi 和 Lazarus 核心产品将统一整合, 一起来看!

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…