leetCode - - - 二分查找

news2024/9/22 9:35:52

目录

1.二分查找(Leetcode 704)

2.搜索插入位置( LeetCode 35 )

3.寻找峰值(LeetCode 162)

4.旋转数组的最小数字(BM21)

5.总结


1.二分查找(Leetcode 704)

给定一个 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
class Solution {
    public int search(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        //while(left < right): 这个条件会在 left 和 right 相邻时停止循环。
        //因此,当 left 和 right 相邻时,如果目标值恰好在 right 位置,循环将结束而不会进行最后一次检查。
        //所以要写left<=right
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
                return mid;
            }else if(nums[mid]<target){
                left=mid+1;
            }else if(nums[mid]>target){
                right=mid-1;
            }
        }
        return -1;
    }
}

2.搜索插入位置( LeetCode 35 )

https://leetcode.cn/problems/search-insert-position/description/

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

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

和上一题相比,多了一步查找不到target插入,观察退出循环时:

因此,代码只是在二分查找的基础上多了一步返回到left下标。

class Solution {
    public int searchInsert(int[] nums, int target) {
        int left=0;
        int right=nums.length-1;
        //while(left < right): 这个条件会在 left 和 right 相邻时停止循环。
        //因此,当 left 和 right 相邻时,如果目标值恰好在 right 位置,循环将结束而不会进行最后一次检查。
        //所以要写left<=right
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
                return mid;
            }else if(nums[mid]<target){
                left=mid+1;
            }else if(nums[mid]>target){
                right=mid-1;
            }
        }
        return left;
    }
}

3.寻找峰值(LeetCode 162)

https://leetcode.cn/problems/find-peak-element/description/

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题

示例 1:

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。

示例 2:

输入:nums = [1,2,1,3,5,6,4]输出:1 或 5 
解释:你的函数可以返回索引 1,其峰值元素为 2;
     或者返回索引 5, 其峰值元素为 6。

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

4.旋转数组的最小数字(BM21)

https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=295&tqId=23269&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1≤n≤100001≤n≤10000,数组中任意元素的值: 0≤val≤100000≤val≤10000

要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)

示例1

输入:[3,4,5,1,2]

复制返回值:1

示例2

输入:[3,100,200,3]

复制返回值:3

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int minNumberInRotateArray (int[] nums) {
        int left=0;
        int right=nums.length-1;
        while(left<right){
            int mid=left+(right-left)/2;
            if(nums[mid]>nums[right]){
                left=mid+1;
            }else if(nums[mid]<nums[right]){
                right=mid;
            }else{
                right--;
            }
        }
        return nums[left];
    }
}

5.总结

利用二分查找的分治策略,提高查找效率。
对于特定结构(如有序或旋转数组)的优化,减少时间复杂度到 O(logn)
动态调整搜索范围,依据当前状态决定下一步的方向。

二分查找(Leetcode 704):在有序数组中,通过二分查找快速定位目标值的索引。每次将搜索范围缩小一半,直到找到目标或范围为空。

搜索插入位置( LeetCode 35 ):在有序数组中,利用二分查找确定目标值的插入位置。通过比较目标值和中间值,调整搜索范围来找到插入点,保持数组有序。


寻找峰值(LeetCode 162):寻找局部峰值(比相邻元素大的元素)。通过二分查找逐步缩小范围,根据中间元素与其相邻元素的关系调整搜索方向,找到峰值。


旋转数组的最小数字(BM21):在旋转排序数组中,通过二分查找找到最小值。比较中间值与左右端点值,调整搜索范围以找到最小值,利用旋转数组的特点来决定方向。

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

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

相关文章

基于Python的机器学习系列(7):多元逻辑回归

在本篇博文中&#xff0c;我们将探讨多元逻辑回归&#xff0c;它是一种扩展的逻辑回归方法&#xff0c;适用于分类数量超过两个的场景。与二元逻辑回归不同&#xff0c;多元逻辑回归使用Softmax函数将多个类别的概率输出映射到[0, 1]范围内&#xff0c;并确保所有类别的概率和为…

利用漏洞实现 Outlook 的 RCE:第一部分

概述 2023 年 3月补丁星期二解决的漏洞中,有一个是Outlook 的一个严重漏洞,编号为CVE-2023-23397,该漏洞被 Forest Blizzard 在野利用,微软已将其确定为俄罗斯国家支持的威胁行为者。2023 年 12 月,微软与波兰网络司令部 (DKWOC) 联合发布消息称,他们发现同一威胁行为者…

Debug-023-Document.createElement()的使用

Document.createElement() document.createElement()是在对象中创建一个对象&#xff0c;要与appendChild() 或 insertBefore()方法联合使用。 appendChild() 方法在节点的子节点列表末添加新的子节点。 insertBefore() 方法在节点的子节点列表任意位置插入新的节点。 用途举…

Linux -- git

1 啥是git git是一个代码的历史版本管理工具&#xff0c;通过用树形结构管理一个代码版本可以快速实现回滚等操作 1.1 git基本概念 工作区&#xff08;Working Directory/Working Tree&#xff09;&#xff1a; 这是你当前正在处理项目文件的地方。你可以在工作区中创建、修改…

非关系型数据库MongoDB(文档型数据库)介绍与使用实例

MongoDB介绍 MongoDB是一种开源的文档型数据库管理系统&#xff0c;它使用类似于JSON的BSON格式&#xff08;Binary JSON&#xff09;来存储数据。与传统关系型数据库不同&#xff0c;MongoDB不使用表和行的结构&#xff0c;而是采用集合&#xff08;Collection&#xff09;(My…

漏洞发现——漏洞扫描工具的对比

本帖字的实验环境是来自学校的靶机 文章目录 Xray介绍安装教程使用教程主动扫描单个url扫描批量扫描 被动扫描联合游览器联合burpsuite Awvs介绍安装教程使用教程联合xary三者联合bp和xray Goby介绍安装教程使用教程 Afrog介绍安装教程使用教程 Vulmap介绍安装教程使用教程 Poc…

SpringMVC核心机制环境搭建

文章目录 1.SpringMVC执行流程1.基础流程图2.详细流程图 2.安装Tomcat1.下载2.解压到任意目录即可3.IDEA配置Tomcat1.配置Deloyment2.配置Server 3.创建maven项目1.创建sun-springmvc模块&#xff08;webapp&#xff09;2.查看是否被父模块管理3.pom.xml引入依赖4.目录5.SunDis…

电子电气架构--- 智能汽车电子架构的核心诉求

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

Android点击和触摸音量小的问题(问题追踪)

有客户反馈&#xff1a;A14触摸声音没有 于是乎&#xff0c;追踪setting打开触摸声音的代码&#xff1a; Overridepublic boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {if (preference mVibrateWhenRinging) {Settings.System…

Linux | 进程优先级进程的环境变量

文章目录 进程概念4、进程优先级4.1基本概念4.2查看系统进程4.2.1 ps -l4.2.2 PRI & NI 4.3用top命令更改已存在进程的nice&#xff1a; 5、环境变量5.1常见环境变量5.2查看环境变量5.3测试PATH配置环境变量 5.4代码中获取环境变量5.4代码中获取环境变量 进程概念 4、进程…

RFID 智慧城市书房:开启智慧阅读新时代

在当今数字化、智能化的时代&#xff0c;人们对于阅读的需求和体验也在不断升级。RFID 智慧城市书房的出现&#xff0c;为满足人们对高品质阅读环境的追求提供了全新的途径。 一、RFID 技术&#xff1a;智慧城市书房的核心支撑 RFID&#xff0c;即射频识别技术&#xff0c;是一…

DDS IP实现啁啾信号

简介 DDS&#xff08;Direct Digital Synthesizer&#xff09;即数字合成器&#xff0c;是一种新型的频率合成技术&#xff0c;具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点&#xff0c;对数字信号处理及其硬件实现有着很重要的作用。DDS 的基本…

18945 小团的配送团队

### 思路 1. **建图**&#xff1a;将订单视为图的节点&#xff0c;已知关系视为图的边&#xff0c;构建无向图。 2. **连通分量**&#xff1a;使用深度优先搜索&#xff08;DFS&#xff09;或广度优先搜索&#xff08;BFS&#xff09;找到图中的所有连通分量。 3. **排序**&…

探索人工智能的未来:埃里克·施密特2024斯坦福大学分享六

代理与文本生成模型的未来展望 您认为明年代理或文本生成模型会出现通货膨胀点吗&#xff1f; 不&#xff0c;不会。 我听到了类似的观点&#xff0c;尤其是埃里克科维茨的看法。他有一个很好的方式来阐述这三个趋势。虽然我之前也听说过这些趋势&#xff0c;但将它们整合起…

C语言破墙镐对称飞迷宫

目录 开头程序程序的流程图程序游玩的效果(gif)结尾 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <Windows.h> enum WASD {W,A,S,D }; void printmaze(const char s…

【CTF Web】CTFShow cookie泄露 Writeup(cookie泄露+URL解码)

cookie泄露 10 cookie 只是一块饼干&#xff0c;不能存放任何隐私数据 解法 按 F12 打开开发者工具&#xff0c;点击网络&#xff0c;刷新页面。 flag 在 响应标头的 Set-Cookie 中。 用 URL 解码工具转换。 Flag ctfshow{8483acdb-a677-4c77-8aff-438d44ff1a3e}声明 本博客…

论文翻译软件哪个好用?如何将论文转化?

在学术海洋里遨游&#xff0c;每一篇论文都是思想的灯塔。 但当这座灯塔用外语构建&#xff0c;如何让它在中国读者面前同样熠熠生辉&#xff1f;别担心&#xff0c;把论文翻译成中文的旅程&#xff0c;不仅可以轻松启航&#xff0c;还能优雅靠岸&#xff01; 不知道怎么把论…

【Android笔记】Android APK编译打包流程

前言 本文将介绍Android从一个项目打包成APK的过程&#xff0c;其中涉及Android Java和Kotlin文件、资源文件、清单文件、依赖jar包和so库等在打包过程中处理。 步骤 总体的打包流程如下图&#xff0c;下面就介绍下详细的打包步骤。 1、将aidl文件编译成java文件 在构建过程中…

OpenAI API VBA function returns #Value! but MsgBox displays response

题意&#xff1a;“OpenAI API VBA 函数返回 #Value!&#xff0c;但 MsgBox 显示响应” 问题背景&#xff1a; I am trying to integrate the OpenAI API into Excel. The http request to OpenAI chat completion works correctly and the response is OK. When I display it…

esp32c3 luaos

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、介绍二、相关介绍2.1helloworld——2.2任务框架2.3消息传递 与消息订阅2.4uart2.5二进制数据/c结构体的打包与解析2.6 zbuffer库2.8 uart 485 数据解析2.9 …