【算法专题】二分查找(入门)

📑前言

本文主要是二分查找(入门)的文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是青衿🥇
☁️博客首页:CSDN主页放风讲故事
🌄每日一句:努力一点,优秀一点

在这里插入图片描述

目录

文章目录

  • 📑前言
  • **目录**
    • 二分查找
      • 1. 二分查找搜索
      • 2. 在排序数组中查找元素的第一和最后一个位置
  • 📑文章末尾


二分查找

1. 二分查找搜索

题目链接 -> Leetcode -704.二分查找

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

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

思路:
1.数组为有序数组,同时题目还强调数组中无重复元素
2.定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
3.终止条件为right < left;

Java代码如下:

class Solution {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1; // 注意

        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 -34.在排序数组中查找元素的第一和最后一个位置

Leetcode -34.在排序数组中查找元素的第一和最后一个位置

题目:给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回[-1, -1]。

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

示例 1:
输入:nums = [5, 7, 7, 8, 8, 10], target = 8
输出:[3, 4]

示例 2:
输入:nums = [5, 7, 7, 8, 8, 10], target = 6
输出:[-1, -1]

示例 3:
输入:nums = [], target = 0
输出:[-1, -1]

提示:

  • 0 <= nums.length <= 10^5
  • 10^9 <= nums[i] <= 10^9
    nums 是一个非递减数组
  • 10^9 <= target <= 10^9

思路:
1.数组为有序数组,且是一个升序数组
2.定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
3.终止条件为right < left;
4.两个函数分别找左边界和右边界
5.getRightBorder函数下的右边界为right即left - 1;getLeftBorder函数下的左边界为left即right+1
可画图理解判断条件:
在这里插入图片描述

代码如下:

class Solution {
        public int[] searchRange(int[] nums, int target) {
       int leftborder = getLeftBorder(nums, target);
        int rightborder = getRightBorder(nums, target);
            if (leftborder == -2 || rightborder == -2) {
                return new int[]{-1,-1};
            }
            if (rightborder - leftborder > 1) {
                return new int[]{leftborder+1, rightborder - 1};
            }
            return new int[]{-1,-1};}
            int getLeftBorder(int[] nums, int target) {
                int left = 0;
                int right = nums.length - 1;
                 int leftborder = -2;
                while (left <= right) {
                    int mid = left + ((right - left ) >> 1);
                    if (nums[mid] >= target) {
                        right = mid-1;
                    }
                    else {
                        left = mid+1;
                    }
                    leftborder = right;
                }

                return leftborder;
            }
            int getRightBorder(int[] nums, int target) {
                int left = 0;
                int right = nums.length - 1;
                int rightborder = -2;
                while (left <= right) {
                    int mid = left + ((right - left ) >> 1);
                    if (nums[mid] <= target) {
                        left = mid+1;
                    }
                    else {
                        right = mid-1;
                    }
                    rightborder = left;
                }
                return rightborder;

            }
    }
    

📑文章末尾

在这里插入图片描述

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

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

相关文章

华清远见作业第三十四天——C++(第三天)

思维导图&#xff1a; 题目&#xff1a; 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 代码&#…

【计算机网络】概述|分层体系结构|OSI参考模型|TCP/IP参考模型|网络协议、层次、接口

目录 一、思维导图 二、计算机网络概述 1.计算机网络定义、组成、功能 2.计算机网络分类 3.计算机网络发展历史 &#xff08;1&#xff09;计算机网络发展历史1&#xff1a;ARPANET->互联网 &#xff08;2&#xff09;计算机网络发展历史2&#xff1a;三级结构因特网 …

C++:类 的简单介绍(一)

目录 类的引用&#xff1a; 类的定义&#xff1a; 类的两种定义方式&#xff1a; 成员变量命名规则的建议&#xff1a; 类的访问限定符及封装&#xff1a; 访问限定符 【访问限定符说明】 封装 class与struct的区别&#xff1a; 类的作用域&#xff1a; 类的实例化…

JVM-字节码文件的组成

Java虚拟机的组成 Java虚拟机主要分为以下几个组成部分&#xff1a; 类加载子系统&#xff1a;核心组件类加载器&#xff0c;负责将字节码文件中的内容加载到内存中。 运行时数据区&#xff1a;JVM管理的内存&#xff0c;创建出来的对象、类的信息等等内容都会放在这块区域中。…

机器学习_集成学习之Boosting(提升较弱的模型,以降低弱模型的偏差)

文章目录 介绍AdaBoost算法梯度提升算法(GBDT)极端梯度提升(XGBoost)Bagging 算法与 Boosting 算法的不同之处 介绍 Boosting 的意思就是提升&#xff0c;这是一种通过训练弱学习模型的“肌肉”将其提升为强学习模型的算法。要想在机器学习竞赛中追求卓越&#xff0c;Boosting…

Go语言安装及开发环境配置

目录 官网 国内 Linux(CentOS & Ubuntu)安装 环境变量设置 命令行下开发 开发模式执行 编译 IDE下开发 插件安装 安装依赖工具 运行 常见问题 1、dial tcp 172.217.160.113:443: i/o timeout 2、VS Code不能完美显示zsh问题 官网 访问Golang官网的下载链接&a…

Python tkinter (6) —— Listbox控件

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinter (5) 选项按钮与复选框 目录…

浏览器——HTTP缓存机制与webpack打包优化

文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制&#xff0c;修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…

SpringBoot不同的@Mapping使用

文章目录 一、介绍二、使用 一、介绍 一般Mapping类注解在Spring框架中用于将HTTP请求映射到对应的处理器方法。它们各自对应于不同类型的HTTP方法&#xff0c;主要用于RESTful Web服务中。以下是每个注解的作用&#xff1a; GetMapping: 用于映射HTTP GET请求到处理器方法。通…

操作符讲解

目录 二进制和进制转换 原码、反码、补码 移位操作符 位操作符 一道面试题&#xff1a; 练习1&#xff1a; 思考题&#xff1a; 练习2&#xff1a; 逗号表达式 函数调用操作符() 结构成员访问操作符 结构体 操作符的属性&#xff1a;优先级、结合性 优先级&#x…

༺༽༾ཊ—Unity之-03-建造者模式—ཏ༿༼༻

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

IndexedDB入门

https://www.cnblogs.com/zhangzuwei/p/16574791.html 注意 1.删除表&#xff0c;创建表只能在数据库版本升级里面进行。 2.keypath: key 要和表字段对应&#xff0c;而且格式要一样&#xff0c;不然不运行不报错。 3.使用 autoIncrement: true 代替 keypath: key&#xff…

C++ 数论相关题目 扩展欧几里得算法(裴蜀定理)

给定 n 对正整数 ai,bi &#xff0c;对于每对数&#xff0c;求出一组 xi,yi &#xff0c;使其满足 aixibiyigcd(ai,bi) 。 输入格式 第一行包含整数 n 。 接下来 n 行&#xff0c;每行包含两个整数 ai,bi 。 输出格式 输出共 n 行&#xff0c;对于每组 ai,bi &#xff0c;求…

实验5:冒泡法排序

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 3、实验要求&#xff1a; 4、程序流程图&#xff1a; 5、实验源程序&#xff1a; 6、实验要求分项截图及结果分析&#xff1a; 1、实验目的&#xff1a; 通过冒泡法排序程序设计&#xff0c;掌握将多重循环程序设…

技术书评和笔记【01】脑机接口-电路与系统 【2020版】

前言: 荷兰作者,Amir Zjajo博士,毕业于荷兰代尔夫特理工大学,方向 面向移动健康的低功耗混合型号电路与系统,以及,面向认知的神经形态电路。 ,脑机接口 - 电路与系统一书,系统介绍了,脑机接口电路与系统的实现技术,尤其,提到了量产和设计的问题,难能可贵,摘录如…

浪潮信息集中式存储仪电云云操作系统兼容性良好 通过澎湃技术认证

日前&#xff0c;浪潮信息集中式存储与仪电云i-stack云操作系统软件完成澎湃技术认证。在兼容性测试认证中&#xff0c;双方均表现出良好的兼容性能&#xff0c;同时系统运行可靠稳定&#xff0c;功能及性能表现俱佳。 浪潮信息澎湃技术认证是浪潮信息基于自身多元、创新的通用…

实际项目中的SpringAOP实现日志打印

目录 一、AOP实现日志 1.1 需求分析&#xff1a; 1.2 定义切面类和切点&#xff1a; 扩展&#xff1a;finally中的代码块一定会执行吗&#xff1f; 扩展 总结 1.3 定义环绕通知 1.4 handleBefore 的具体实现 1.4.1 获取url 1.4.2 获取接口描述信息 1.4.3 后续获取 1.5…

二叉树|116.填充每个节点的下一个右侧节点指针 117. 填充每个节点的下一个右侧节点指针 II

116.填充每个节点的下一个右侧节点指针 题目&#xff1a; 给定一个完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next …

CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型

1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次&#xff0c;每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…

如何在AirPods Pro中使用降噪功能?这里提供几个方法

本文介绍了如何在AirPods Pro上使用降噪功能&#xff0c;如何关闭它&#xff0c;以及该功能的工作原理。 注意&#xff1a;AirPods Pro和AirPods Max支持噪音消除。你的设备必须运行iOS 13.2或iPadOS 13.2或更高版本才能使用降噪功能。 如何在AirPods Pro上打开降噪功能 Air…