代码随想录第一天

news2024/9/22 23:26:27

专题:数组

题目:二分查找

题目要求

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。(升序意味着没有重复的元素)

题目理解:

因为题目满足 有序数组 并且 无重复元素 两个特点,所以可以对他使用二分查找。

如果不是有序数组不能使用二分查找;

如果数组有重复元素,返回的下标可能就不唯一了,所以也不能使用二分查找;

 大体思想

        用左下标left指向数组的第一个元素 ,右下标right指向数组的最后一个元素。在左下标 小于 右小标的前提下,循环进行下面的操作。

        取当前左下标 和 右下标 的中间下标对应的值 和 目标值比较,如果目标值小于中间下标对应的值,那么说明目标值在当前左右下标区间的左半部分,此时我们更新右下标,让右下标指向中间下标。然后左右下标区间就缩小了一半,下一次查找的范围也缩小了一半。

        取当前左下标 和 右下标 的中间下标的值 和 目标值比较,如果目标值大于中间下标值,那么说明目标值在当前左右下标区间的右半部分,此时我们更新左下标,让左下标指向中间下标。然后左右下标区间就缩小了一半,下一次查找的范围也缩小了一半。

        取当前左下标 和 右下标 的中间下标的值 和 目标值比较,如果目标值等于中间下标值,那么找到了目标值,直接返回中间下标。

        如果直到 左右下标不满足条件,退出循环。那说明数组中没有目标值,返回-1;

细节注意

左闭右闭:nums.size()求出的是数组的有效元素的个数。而根据数组的特性,元素下标从0开始,即第一个元素的下标是0,第二个元素的下标是1...最后一个有效元素的下标是 nums.size() -1,那么nums.size()对应的元素,就是数组后面的第一个无效元素。

         所以左闭右闭要求:左下标从第一个元素开始 left = 0;右下标指向最后一个有效元素 right = nums.size()-1; 由于左下标右下标指向的都是有效元素,所以在while循环时,条件为(left <= right);

         在更新左边界的时候,由于原来的中间指针指向的元素,已经参加了比较,所以下一个比较可以直接越过它。并且不管是左下标指向中间下标的后一个元素,还是右下标指向中间下标的前一个元素,左右下标都可以拿到这个值,参与到这次的循环比较中来。不会遗漏。所以,更新左下标的时候 left = mid+1; 更新右下标的时候 right = mid -1; 

 左闭右开:nums.size()求出的是数组的有效元素的个数。而根据数组的特性,元素下标从0开始,即第一个元素的下标是0,第二个元素的下标是1...最后一个有效元素的下标是 nums.size() -1,那么nums.size()对应的元素,就是数组后的第一个无效元素。

         所以左闭右开要求:左下标从第一个元素开始 left = 0;右下标指向数组后第一个无效元素 right = nums.size(); 由于右下标指向的是无效元素,所以在while循环时,不能取等于条件。 写为:while(left < right);

         在更新左边界的时候,由于原来的中间指针指向的元素,已经参加了比较,所以下一个比较可以直接越过它。让左下标直接指向中间下标的后一个位置的下标。但是更新右下标时,因为右下标指向的空间不能访问,所以此时,就不能让右下标指向中间下标的前一个,如果指向中间下标的前一个,那么中间下标的前一个的元素,就不能参与到下一个次循环比较当中,就会造成数据丢失。所以,更新左下标的时候 left = mid+1; 更新右下标的时候 right = mid; 

代码实现: 

 

 题目:移除元素

题目要求

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

题目理解: 

数组,原地移除所有数值等于val的值,返回数组新长度。 不能使用新空间,只能在原来的数组上进行操作,根据数组的特性,移除元素,不能删除而是依靠覆盖的方式。可以采用暴力移除法,或者快慢指针法去实现。

大体思想 

暴力循环法:第一层for循环,遍历数组。一旦发现当前元素等于val,那么就从这个元素处,再加一次for循环,把后面的元素都往前依次移动一个位置,覆盖当前的这个值等于val的元素。这样大循环完成,那么数组中值等于val的元素都会被移除。

细节注意

暴力循环法,小循环每执行一次,覆盖一个元素,控制访问数组大小的size就要减1.还有就是我们要人为的给大的for循环的循环变量减1.因为后面的元素都往前移动了一位。如果让大循环的变量直接走的话,会把本来下次应该访问的元素,结果因为后面的元素全部往前移一位,导致错过访问。所以每次小循环结束,我们要人为的给大循环的循环变量-1;

代码实现

为啥不正确???

这是因为,我们没有控制访问数组元素的大小。

知识点补充:数组无论你是前移动数组元素,还是后移动数组元素。被移动那个数组元素还存在,并且那个数组元素的值也不会改变。只是其他元素的值被赋值改变了。并且数组的大小也没有改变。nums.size()还是和原来一样。 

例如:数组[3,2,2,3],移除val=3的元素。

      大循环是for(i = 0; i < 4; i++)  然后经过第一个大循环就会变成[2,2,3,3],然后i--.又变成了for(i = 0; i < 4; i++);现在遇到[2,2]之后,变成for(i = 2; i < 4; i++);遇到了nums[2] = val;然后把后面的3往前赋值一个之后得到[2,2,3,3].此时i- - 又回到了for(i = 2; i < 4; i++);又遇到了nums[2] = val;然后又是一直循环。就会出现超时现象。

 我们要控制的,不是数组真正的大小nums.size(),而是去控制遍历数组的大小size。

所以使用一个size先记录下原来数组的大小,然后在移除的时候通过改变size的大小,来控制访问数组的大小。

例如:数组[3,2,2,3],移除val=3的元素。

      size= 4;大循环是for(i = 0; i < 4; i++)  然后经过第一个大循环就会变成[2,2,3,3], 此时size= 3; 然后i--.又变成了for(i = 0; i < 3; i++);现在遇到[2,2]之后,变成for(i = 2; i < 3; i++);遇到了nums[2] = val; i--,size--; size=2; i=2; 现在for(i = 2; i < 2;i++)退出循环了。数组的大小size就是2。

代码实现

快慢指针法:因为可以通过下标访问数组元素,所以我们可以使用两个下标,fast,slow。让fast先走,slow跟在fast后面。fast遍历数组,如果fast当前指向的元素不等于val,那么将fast指向的元素赋给slow,并且slow往下走一步。如果fast指向的元素等于val,那么啥也不干,fast继续执行循环。这样fast的循环完成之后,slow就是新数组的元素个数,并且当前数组的前slow个,就是要得到的数组。

细节注意

赋值是注意slow是先赋值后++。即 nums[slow++] = nums[fast];

代码实现 

学到的知识:深刻理解了数组元素的移动,以及数组元素的下标访问。

标准:根据自己的理解,独立写出来,并且一把运行通过。

否则:等于没学习!!!

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

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

相关文章

信号相角位移量的计算与信号位移计算-附Matlab代码

一、初始相角的位移量 在信号处理中正弦信号经常表示为 x(n)Acos⁡(2πf0n/fsθ)x\left( n \right)A\cos (2\pi {{f}_{0}}n/{{f}_{s}}\theta )x(n)Acos(2πf0​n/fs​θ)&#xff0c;其中 fs{{f}_{s}}fs​是采样频率&#xff0c; f0{{f}_{0}}f0​是正弦信号的频率&#xff0c;…

volatile关键字的原理和要避免的误区

1>防止指令重排 2>禁用工作内存缓冲区&#xff0c;直接使用主内存。 经典使用场景 场景1 public static Singleton getInstance() { //第一次null检查 if (instance null) { synchronized (Singleton.class) { //1 //第二次null检查 if (instance null) { //2…

flink sql gateway初探

文章目录前言1.启动SQL gateway2.打开session3.执行flink SQL4.查看执行结果5.获取operationHandle的status6.注意事项7.官方链接前言 flink 1.16版本中发布了一个新功能–SQL gateway&#xff0c;本篇文章就来实践测试下该功能。 1.启动SQL gateway ./bin/sql-gateway.sh st…

让企业报表化繁为简,Smartbi实现报表统一管理

报表作为大家日常工作的关键和必不可少的内容&#xff0c;往往需要定期进行维护和更新。处在工作的不同时间、不同岗位、不同职责&#xff0c;要做的报表也各不相同。随着时间的推移&#xff0c;手上的报表也会越来越多&#xff0c;而这还只是从个人的角度出发来理解&#xff0…

[附源码]Python计算机毕业设计Django学生在线考试系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

java计算机毕业设计ssm洗浴管理系统l9omz(附源码、数据库)

java计算机毕业设计ssm洗浴管理系统l9omz&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

脉冲波形的产生和整形

一个周期性的脉冲信号&#xff0c;我们希望可以提供0和1的电平值 边沿的好坏&#xff0c;跳转时间长&#xff0c;效果就不好&#xff0c;特性就不好&#xff0c;所以描述周期性的脉冲信号的时候&#xff0c;有相应的参数&#xff0c;高低电平我们一般画成等宽的&#xff0c;尽…

深度学习入门篇 | 常用的经典神经网络模型

**神经网络&#xff0c;是模拟生物神经网络进行信息处理的一种数学模型。**它以对大脑的生理研究成果为基础&#xff0c;其目的在于模拟大脑的某些机理与机制&#xff0c;实现一些特定的功能。神经网络是目前最火的研究方向深度学习的基础&#xff0c;本文将神经网络分成三个主…

【Java面试】谈一谈你对ThreadLocal的理解

文章目录ThreadLocal原理大致设计底层理解【Java面试】说说你对ThreadLocal内存泄漏问题的理解hash冲突的解决get/set/remove方法的一些细节在多线程情况下&#xff0c;对于一个共享变量或者资源对象进行读或者写操作时&#xff0c;就必须考虑线程安全问题。而ThreadLocal采用的…

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三)

Three.js实例详解___旋转的精灵女孩(附完整代码和资源)&#xff08;三&#xff09; 本篇目录&#xff1a; 六、完整构建整个[旋转的精灵女孩]实例 &#xff08;1&#xff09;、新建、启动webGL工程空间 &#xff08;2&#xff09;、构建项目的目录层次结构 &#xff08;2.1…

EVE-NG安装问题记录 重置root密码

目录EVE-NG安装问题记录 重置root密码一、下载iso安装虚拟机二、碰巧没安装成功EVE-NG组件&#xff0c;开启EVE-NG机后 root/eve默认密码不对。进不去系统。1、进入单用户模式重置root密码三、重新安装eve-ng组件EVE-NG安装问题记录 重置root密码 一、下载iso安装虚拟机 从官…

ssm+mysql实现进销存系统|仓库计算机专业毕业论文java毕业设计开题报告

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssmmysql实现进销存系统》该项目采用技术&#xff1a;jsp springmvcspringmybatis cssjs等相关技术&#xff0c;项目含有源码、文档、配套开发软…

嵌入式软件开发知识点总结(二)中断Linux内核

【好文推荐】 路由选择协议——RIP协议 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 概述Linux内核驱动之GPIO子系统API接口 一篇长文叙述Linux内核虚拟地址空间的基本概括 中断 硬中断 …

应用开发这样做更节约成本!

现在app已逐渐取代网页端&#xff0c;成为一众手机用户的心头好。要想轻松拿下更多目标用户&#xff0c;开发一个属于自己的app显得尤为重要。那么&#xff0c;在应用开发方面&#xff0c;我们有什么妙招可以降低开发成本呢&#xff1f; 1、明确开发需求 做好我们的app定位&am…

【NumPy 数组索引、裁切,数据类型】

&#x1f935;‍♂️ 个人主页老虎也淘气 个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f44d;&#x1f3fb; 收藏…

6年测开经验,从功能测试到测试开发,我的每一步都经过了深思熟虑...

蓦然回首&#xff0c;软件测试风风雨雨的这几年&#xff0c;起初每天的工作只是鼠标点点点&#xff0c;我还真不知道怎么办&#xff0c;闲的时候真的怀疑自己的存在价值&#xff0c;每天拿着7000的工资&#xff0c;飘荡在繁华的深圳&#xff0c;吃不饱也饿不死&#xff0c;未来…

阿里 p8 私藏 MyBatis 笔记,从入门到精通,纵享源码细节

前言 越来越多的企业已经将 MyBatis 使用到了正式的生产环境&#xff0c;我认为流行的原因就在于绝大部分项目都是面向表结构编程的&#xff0c;把 Java 对象仅当成数据容器&#xff0c;查询和模型变更都设计在一张表上&#xff0c;所谓业务逻辑就是一堆增删改查的 sql 集合&a…

Cadence Allegro PCB设计88问解析(二十一) 之 Allegro中更新器件封装(Footprint)

一个学习信号完整性仿真的layout工程师 今天和大家简单介绍Allegro中如何更新PCB封装&#xff0c;在我们导入原理图网表&#xff0c;PCB的封装是必不可少的&#xff0c;但是可能有些为了前期布局评审&#xff0c;有的封装是临时的&#xff0c;那么就需要后续更新正确的封装。下…

02 Java起步

目录 第一章&#xff1a;注释 1.1 概述 1.2 Java 中的注释 第二章&#xff1a;关键字 2.1 概述 2.2 Java 中的关键字 第三章&#xff1a;标识符 3.1 概述 3.2 标识符的命名规则&#xff08;必须遵守&#xff09; 3.3 标识符的命名规范 第四章&#xff1a;数据类型以…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win10)

还有9天就截止报名了&#xff0c;我们也算正式开始培训了&#xff0c;今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建&#xff1a; 学生机环境-Java编程环境&#xff08;第十四届大赛&#xff09; 链接: https://pan.baidu.com…