【代码随想录】算法训练营 第一天 第一章 数组 Part 1

news2024/11/16 22:46:24

数组基础知识补充

1. 在leecode中,数组一般是以vector容器的形式出现的,虽然vector的底层实现是array,但严格来讲vector是容器,不是数组;

2. 数组元素的删除和增添都需要移动后续元素,而且在实现的角度上看,数组元素是不能删的,只能用后一个元素将其覆盖掉,然后再逐个覆盖,就相当于向前移动后续元素了;

3. C++二维数组的存储空间是连续的,但Java的不是,Java中每一个外层数组都会有指针指向内层数组的地址。

704. 二分查找

题目

左闭右闭方法

左闭右闭,意味着搜索区间是闭合的,比如 [ 1 , 5 ],在这种区间搜索元素,两个指针指向同一个元素时一定是有意义的,因为区间涉及到的元素都在区间内;

但如果搜索区间是半开半闭的,那么就要考虑指针不能指向开的那个元素,需要对代码进行一定的改动。

思路

用二分查找来做这道题是高效且简单的,因为元素递增不重复;

闭合区间二分的思路是,分别给数组的最左边和最右边一个指针,每次通过求两个指针指向地址的中间处那个元素的值,来判断是否和目标值相等,相等的话就返回中间处的值的下标,不相等的话则分为两种情况:

如果中间处的值小于目标值,以为这中间处以及它的左边的元素都太小,所以接下来我们就把搜索区间的左边界缩到中间处右边一个的元素那里;

如果中间处的值大于目标值,同理就把搜索区间的右边界缩小到中间处左边一个的元素那里。

因为这里是一个闭区间,所以二分的终止条件就是两个指针指向相同,这时候如果指向的元素不等于目标值,那就返回 -1 。

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, r = nums.size() - 1; 
        int mid = 0;
        while (l <= r) {
            mid = l + (r - l) / 2; // 防止l和r过大,直接相加越界
            if (nums[mid] == target)
                return mid;
            if (nums[mid] < target)
                l = mid + 1;
            else
                r = mid - 1;
        }
        // 带入一个有两个元素的数组测试样例就知道,如果我们的目标是后者,第一次的mid指向前面那个,后面的l加一以后就指向目标了,这时候l和r相等,mid也和它们相等了,可以得到结论;
        //如果没有在while条件中写=,那么l和r指向相同时就直接跳出循环了,这时候mid还未赋新值,就会出错
        return -1;
    }
};

左闭右开方法

思路

大体上和上面的方法一样,主要注意的是while的终止条件,这时候就不能是指针指向相同了,要把等于号去掉,因为区间边界一开一闭,两者显然是不能混为一谈的;

另外,开区间的那一边的搜索边界需要注意,如果mid指向的元素大于目标值,那么这时候将有边界缩小到mid即可,不用减一,具体见代码。

代码

class Solution {
public:
    int search(vector<int>& nums, int target) {
         int l = 0, r = nums.size();
         while (l < r) {
             int mid = l + (r - l) / 2;
             if (nums[mid] < target)
                l = mid + 1;
            else if (nums[mid] > target)
                r = mid; // 这时候不能再写mid-1了,因为这是开区间,mid肯定不可能是目标值了,但是mid-1可能是,如果把mid-1赋值给r,那就意味着排除掉了mid-1
            else
                return mid;
         }
         return -1;
    }
};

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

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

相关文章

C++初阶 入门

目录 1.用C的方式写一个Hello World 2.命名空间 2.1什么是命名空间&#xff1f; 2.2使用命名空间 3.C的输入输出 前言&#xff1a;C初阶系列&#xff0c;每一期博主都会使用简单朴素的语言将对应的知识分享给大家&#xff0c;争取让所有人都可以听懂&#xff0c;C初阶系列…

跨境电商迎来全球5日达革命?菜鸟全球化再提速!

近年来&#xff0c;随着全球化进程的加速和跨境电商的蓬勃发展&#xff0c;物流速度成为了电商行业的竞争制高点之一。消费者不再满足于等待数周&#xff0c;甚至数月的国际快递&#xff0c;他们期望能够像本地购物一样迅速收到国际包裹。 在这一背景下&#xff0c;跨境电商物…

众佰诚:开一家抖音小店需要交押金不?

随着电商行业的不断发展&#xff0c;越来越多的商家开始尝试在不同的平台上开设自己的店铺。抖音作为国内最热门的短视频平台之一&#xff0c;也吸引了众多商家的目光。那么&#xff0c;开一家抖音小店需要交押金吗?接下来&#xff0c;我们就来详细了解一下。 首先&#xff0c…

山西电力市场日前价格预测【2023-10-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-13&#xff09;山西电力市场全天平均日前电价为228.86元/MWh。其中&#xff0c;最高日前价格为396.88元/MWh&#xff0c;预计出现在18: 30。最低日前电价为0.00元/MWh&#xff0c;预计出…

TCP/IP(十二)TCP的确认、超时、重传机制

一 TCP的确认应答机制 确认应答机制: 每次收到数据 都会 给对端发送一个应答报文(ACK) ① 带重传的肯定确认 确认机制: 超时 重传的 肯定 确认 --> 完成了两个作用,或者说有两个含义1、肯定[正确] 确认小结&#xff1a; 我的确认信息是针对正确数据做确认,而不是错误…

YOLOv5算法改进(2)— 注意力机制介绍(SE、CBAM和CA)

前言:Hello大家好,我是小哥谈。注意力机制是近年来深度学习领域内的研究热点,可以帮助模型更好地关注重要的特征,从而提高模型的性能。注意力机制可被应用于模型的不同层级,以便更好地捕捉图像中的细节和特征,这种模型在计算资源有限的情况下,可以实现更好的性能和效率。…

免费SSL证书

在当今数字化时代&#xff0c;保护用户数据和建立安全连接至关重要。对于网站管理员和拥有者来说&#xff0c;SSL证书&#xff08;Secure Sockets Layer&#xff09;是确保安全的关键工具之一。但是&#xff0c;传统上购买和维护SSL证书可能会带来昂贵的成本和繁琐的流程。幸运…

百度车牌识别AI Linux使用方法-armV7交叉编译

1、获取百度ai的sdk 百度智能云-登录 (baidu.com) 里面有两个版本的armV7和armV8架构。v7架构的性能比较低往往需要交叉编译&#xff0c;v8的板子性能往往比较好&#xff0c;可以直接在板子上编译。 解压到ubuntu里面。这里介绍v7架构的。 2、ubuntu环境配置 ubuntu下安装软件…

学生静态HTML网页作品下载后如何导入到HBuilderX中编辑修改及运行

很多同学编辑网页要求使用HBuilder X软件&#xff0c;下载学生网页设计作品后&#xff0c;不知道如何打开&#xff0c;很多同学反应把HTML中的代码复制到HBuilder X后不显示图片或者跑版。今天STU网页为大家讲解下静态HTML网页作品如何导入HBuilder X中运行。 HBuilder X 导入…

『PyQt5-Qt Designer篇』| 13 Qt Designer中如何给工具添加菜单和工具栏?

13 Qt Designer中如何给工具添加菜单和工具栏? 1 创建默认窗口2 添加菜单栏3 查看和调用1 创建默认窗口 当新创建一个窗口的时候,默认会显示有:菜单栏和状态栏,如下: 可以在菜单栏上右键-移除菜单栏: 可以在菜单栏上右键-移除状态栏: 2 添加菜单栏 在窗口上,右键-创建…

城市排水管网监测方案(新型排水管网智能监测技术)

随着我国城市化进程不断加快,城市的排水管网也日益增长并变得复杂,对其进行实时监测以确保正常运行变得极为重要。针对此需求,基于工业物联网技术的新型智能排水管网监测系统为城市排水管网的运行与维护提供了有效手段。 该智能排水管网监测系统以无线通讯功能强大的SG600工业…

VMware和Debian下载

文章目录 ⭐️写在前面的话⭐️一、VMware二、Debain三、建立虚拟机&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680;&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680; ⭐️写在前面的话⭐️ CSDN主页&#xff1a;程序员好冰 目前在…

uniapp + vue3 静态图片引入

方法一 从新定义路径 一定看好你图片的路径 代码 <template><div class"main">Main<img :src"getImg()" alt""></div> </template><!-- 方式一 // <script setup> // let imgName logo.png // cons…

共享WiFi二维码项目如何加盟代理?有哪些注意事项!

随着移动互联网的发展&#xff0c;如今WiFi热点已成为人们日常生活的必需品。而共享wifi二维码项目也渐渐成为了一个非常有前景的共享商业模式。用户可以通过扫共享wifi二维码享受免费的上网服务&#xff0c;而加盟商则可以赚取一定的推广费用&#xff0c;是一种非常理想的商业…

ppt怎么压缩到10m以内?分享ppt缩小方法

在日常工作中&#xff0c;我们常常需要制作和分享PowerPoint演示文稿&#xff0c;然而&#xff0c;有时候文稿中的图片、视频等元素会导致文件过大&#xff0c;无法在电子邮件或其他平台上顺利传输。为了将PPT文件压缩到10M以内&#xff0c;我们可以使用一些专门的文件压缩工具…

EasyRAFT

EasyRaft 介绍 EasyRaft是Raft&#xff08;共识算法&#xff09;的Java实现&#xff0c;主要目的在于提供一种高性能的分布式一致性协议。 覆盖Jraft实现的功能 分布式一致性 分布式一致性 (distributed consensus) 是分布式系统中最基本的问题&#xff0c;用来保证一个分布式…

使用kaliber与imu_utils进行IMU、相机+IMU联合标定

目录 1 标定工具编译 1.1 IMU标定工具 imu_utils 1.2 相机标定工具 kaliber 2 标定数据录制 3 开始标定 3.1 IMU标定 3.2 相机标定 3.3 相机IMU联合标定 4 将参数填入ORBSLAM的文件中 1 标定工具编译 1.1 IMU标定工具 imu_utils 标定IMU我们使用imu_utils软件进行标定…

kepler.gl 笔记:地图样式

1 设置地图样式 2 调整layer的上下顺序 3 地图图层 Label&#xff1a;显示城市、社区等的标签。Road&#xff1a;显示半透明的道路线图层。Border&#xff1a;显示州和大陆边界。Building&#xff1a;显示建筑物轮廓。Water&#xff1a;显示水体。Land&#xff1a;显示公园、山…

Excel 函数大全应用,包含各类常用函数

Excel 函数大全应用&#xff0c;各类函数应用与案例实操。 AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作&#xff0c; Power BI 商业智能 68集&#xff0c; 数据库Mysql8.0 54集 数据库Oracle21C 142集&#xff0c; Office 2021实战&#xff0c; Python 数据分析&#xff0…

批量文件重命名软件 A Better Finder Rename 11汉化for mac

A Better Finder Rename 11是一款功能强大的文件重命名工具&#xff0c;可在Mac操作系统上使用。它提供了简单而直观的界面&#xff0c;帮助用户快速批量重命名文件和文件夹&#xff0c;提高文件管理和组织效率。 以下是A Better Finder Rename 11可能提供的一些主要功能和特点…