代码随想录刷题笔记(DAY1)
前言:因为学校的算法考试让我认识了卡哥,为了下学期冲击大厂实习的理想,我加入了卡哥的算法训练营,从今天开始我每天会更新自己的刷题笔记,与大家一起打卡,一起共勉!
Day 1
01. 二分查找 (No. 704)
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
1.1 笔记
二分法基本上每个学过算法的人都遇到过这个问题,它的思路和代码都很简单但是写的时候经常出错,主要是因为下面两点:
- 外层的 while 的区间是多少?
- 我检测完 middle 的值之后,更新区间是否应该包含这个 middle?
我们在代码提交通过后可能就没有考虑过这个问题,或者说随便改改通过了也扔一边了,今天来具体的解决一下这个问题。
首先我们要清楚搜索区间,很多朋友会感觉很简单,这不就是一开始定义的 left 和 right 吗?其实,我们还要考虑这两个数的区间,是左闭右闭、左闭右开亦或是左开右闭,这才是影响我们上面两个问题的关键因素。
按照比较好理解的左闭右闭举例:[right, left],也就是我们的搜索区间是左闭右闭的,举个例子,[1, 1] 是有意义的,所以 while 中 right 和 left 是可以取到相等的,因为在左闭右闭的前提下,这样取是有意义的。
那来解决第二个问题,新的区间是否应该包含 middle?同样来检验这个区间的合理性,如果包含 middle 的话,比如说,我们通过计算发现nums[mid] 的值要大于target这时候就需要往左边去遍历,也就是比 nums[mid] 小的部分,但这时候有如果按照左闭右闭的区间,其实是包含了这个 nums[mid] 的元素的,这就违背了我们去比它小的部分查找的初衷,所以在这种情况下要取 mid + 1
1.2 代码
class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length - 1;// 左闭右闭的情况while(left <= right) {int mid = left + right;if (nums[mid] > target) {// 向左边查找元素right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;} else {return mid;}}return -1;}
}
1.3 其他情况
剩下的还有左闭右开和左开右闭的情况,这时候我们仍然考虑区间的准确性,比如这时候 [1, 1) 就没有数学意义了,所以我们的 while 中不能再取等于。
以左闭右开为例子来看这个问题:这时候如果说 nums[mid] 比目标值要大的话,向左边查找,这时候写出区间来就是
[left, mid) 还是上面的那个考虑,这时候因为搜索的区间不包含 mid 所以是可以加等于号的。
看到这里兴致冲冲的去写代码,提交发现报错了,这是什么问题呢?
while(left < right) {int mid = (int)((left + right) / 2.0 + 0.5);if (nums[mid] > target) {// 向左边查找元素right = mid;} else if (nums[mid] < target) {left = mid + 1;} else {return mid;}}
因为这时候你的眼里只有这个 while 函数,没有注意到当是开区间的时候 right 是可以等于 nums[length] - 1 的,修改后的代码就是这样的
class Solution {public int search(int[] nums, int target) {int left = 0;int right = nums.length;while(left < right) {int mid = (left + right) / 2;if (nums[mid] > target) {// 向左边查找元素right = mid;} else if (nums[mid] < target) {left = mid + 1;} else {return mid;}}return -1;}
}
写到这里又有顿悟的感觉,自己去试了试左开右闭的情况,不就是把 left = -1 如何把下面的 +1 去掉就好了。
一提交,又报错了。。。
这又是什么原因呢?为什么上面两种情况没有出现问题呢?
首先出现了时间超时肯定是这个 left 卡在了 mid 每次继续都卡在这个位置
这时候关注到这个 mid 的计算方法,很容易发现是向下取整的,在左闭右闭的情况下,左右都不会取到这个 mid 所以不用考虑卡住的情况,左开右闭的情况下,虽然右区间可以取到 mid 但向下取整是保证这个右边界是一直向左靠拢的,但如果是左区间向下取整的话,就有可能会出现卡住的情况:
举个例子:

那为了保证不卡住,解决方法就是更改这个 mid 为向上取整,这样就能保证左区间是持续向右的了。
class Solution {public int search(int[] nums, int target) {int left = -1;int right = nums.length - 1;// 左闭右闭的情况while(left < right) {int mid = (int)((left + right) / 2.0 + 0.5);if (nums[mid] > target) {// 向左边查找元素right = mid - 1;} else if (nums[mid] < target) {left = mid;} else {return mid;}}return -1;}
}
OK!通过
02. 移除元素 (No. 27)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
2.1 笔记
这个题目主要考察我们对数组结构的理解,暴力的解法也很容易想出来,就是我们遇到了等于 val 的元素的话,就将这个数组整体向前移动一位,这时候最后一个元素就变为我们不需要的元素,所以遍历的结尾要减去 1,同时还需要注意的问题就是如果两个连续都是不需要的元素的话,要将 i 仍然保留在当前位置左相同的操作,否则就会漏删元素。
2.2 代码
class Solution {public int removeElement(int[] nums, int val) {int len = nums.length;int N = nums.length;for (int i = 0; i < N; i++) {// 循环遍历数组if (nums[i] == val) {len--;N--;for (int j = i; j < nums.length - 1; j++) {nums[j] = nums[j + 1];} }if (nums[i] == val) {i--;}}return len;}
}
2.3 拓展 —— 双指针法
这道题可以通过双指针思想来解决这个问题,设置一个快慢指针,快指针去遍历这个数组,取到不为 val 的元素后将快指针的内容赋值给慢指针,然后将慢指针加一,这样一直循环直到数组结尾,快指针中取到的元素的个数就是结果数组的元素总数,当快指针遍历完数组后,慢指针指向的最后一个元素就是结果数组的最后一个元素,所以我们返回慢指针的索引也是最终的结果。
class Solution {public int removeElement(int[] nums, int val) {int len = 0;int slow = 0;for (int fast = 0; fast < nums.length; fast++) {if (nums[fast] != val) {len++;nums[slow] = nums[fast];slow++;}}return len; // return slow;}
}
相关文章:
代码随想录刷题笔记(DAY1)
前言:因为学校的算法考试让我认识了卡哥,为了下学期冲击大厂实习的理想,我加入了卡哥的算法训练营,从今天开始我每天会更新自己的刷题笔记,与大家一起打卡,一起共勉! Day 1 01. 二分查找 &…...
Linux域名IP映射
本地域名IP映射 在Linux系统中,域名映射可以通过编辑/etc/hosts文件来实现。/etc/hosts文件用于将主机名映射到IP地址,从而实现本地域名解析。它通常被用于在没有DNS服务器的情况下,手动指定特定域名和IP地址的映射关系。 格式:…...
postman使用-03发送请求
文章目录 请求1.新建请求2.选择请求方式3.填写请求URL4.填写请求参数get请求参数在params中填写(填完后在url中会自动显示)post请求参数在body中填写,根据接口文档请求头里面的content-type选择body中的数据类型post请求参数为json-选择raw-选…...
【Spring实战】09 MyBatis Generator
文章目录 1. 依赖2. 配置文件3. 生成代码4. 详细介绍 generatorConfig.xml5. 代码详细总结 Spring MyBatis Generator 是 MyBatis 官方提供的一个强大的工具,它能够基于数据库表结构自动生成 MyBatis 持久层的代码,包括实体类、Mapper 接口和 XML 映射文…...
【自然语言处理】【大模型】 ΨPO:一个理解人类偏好学习的统一理论框架
一个理解人类偏好学习的统一理论框架 《A General Theoretical Paradiam to Understand Learning from Human Preferences》 论文地址:https://arxiv.org/pdf/2310.12036.pdf 相关博客 【自然语言处理】【大模型】 ΨPO:一个理解人类偏好学习的统一理论框…...
计算机网络——传输层(五)
前言: 最重要的网络层我们已经学习完了,下面让我们再往上一层,对网络层的上一层传输层进行一个学习与了解,学习网络层的基本概念和网络层中的TCP协议和UDP协议 目录 编辑一、传输层的概述: 1.传输层: …...
python3处理docx并flask显示
前言: 最近有需求处理docx文件,并讲内容显示到页面,对world进行在线的阅读,这样我这里就使用flaskDocument对docx文件进行处理并显示,下面直接上代码: Document处理: 首先下载Document的库文…...
Python:正则表达式速通,码上上手!
1前言 正则表达式(Regular Expression)是一种用来描述字符串模式的表达式。它是一种强大的文本匹配工具,可以用来搜索、替换和提取符合特定模式的文本。 正则表达式由普通字符(例如字母、数字、符号等)和元字符&#…...
centos7安装nginx并安装部署前端
目录: 一、安装nginx第一种方式(外网)第二种方式(内网) 二、配置前端项目三、Nginx相关命令 好久不用再次使用生疏,这次记录一下 一、安装nginx 第一种方式(外网) 1、下载nginx ng…...
Hive实战:统计总分与平均分
文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 (二)实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、创建Hive表,加载HDFS数据文件…...
Linux:不同计算机使用NFS共享资源
一,安装NFS文件系统 NFS即网络文件系统(network file system),它允许网络中的计算机之间通过网络共享资源。目前,NFS只用于在Linux和UNIX主机间共享文件系统。 #使用mount命令可以将远程主机的文件系统 安装到 本地: #将远程主机…...
leetcode贪心算法题总结(一)
此系列分三章来记录leetcode的有关贪心算法题解,题目我都会给出具体实现代码,如果看不懂的可以后台私信我。 本章目录 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列5.最长递增子序列6.递增的三元子序列7.最长连续递增序列8.买卖股票的最…...
SQL高级:窗口函数
窗口函数,顾名思义,它的操作对象是窗口,即一个小的数据范围,而不是整个结果集。并且它是一个函数,在SQL中使用,所以一定有返回值。 窗口函数是SQL中非常有趣的部分,这一节我们就来学习一下它。 辅助表 方便我们后边的讲解,这里我们要建一张学生成绩表,建表语句如下…...
Excel formulas 使用总结(更新中)
最近在写task assigment的时候学习到的,记录下。 首先它所有需要写赋值formuls都要用 开头 相等赋值 a1 这个就代表这格的数据和a1是一样的。如果希望其他格和它相同的逻辑,可以直接复制该cell或者直接拖动该cell右下角,他会自动进行匹配…...
华为OD机试 - 两个字符串间的最短路径问题(Java JS Python C)
题目描述 给定两个字符串,分别为字符串 A 与字符串 B。 例如 A字符串为 "ABCABBA",B字符串为 "CBABAC" 可以得到下图 m * n 的二维数组,定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,映射成坐标系如下图。 从原点 (0,0) 到 (0,A) 为水…...
强敌环伺:金融业信息安全威胁分析——钓鱼和恶意软件
门口的敌人:分析对金融服务的攻击 Akamai会定期针对不同行业发布互联网状态报告(SOTI),介绍相关领域最新的安全趋势和见解。最新的第8卷第3期报告主要以金融服务业为主,分析了该行业所面临的威胁和Akamai的见解。我们发…...
1月1日起,贵阳市退役军人可以免费乘坐公交地铁
广大退役军人是党和国家的宝贵财富,是新时代中国特色社会主义现代化建设的重要力量。为切实增强退役军人的幸福感与获得感,贵阳市信捷科技有限公司以“心系老兵情怀,热忱服务人民”为服务宗旨,积极响应贵阳市政府号召,…...
网络隔离后,怎样建立高效安全的数据安全交换通道?
数据安全对企业生存发展有着举足轻重的影响,数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值,想要保护企业核心资产,就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…...
Python:PyTorch
简介 PyTorch是一个开源的机器学习库,由Facebook的人工智能研究团队(FAIR)开发,用于应用于机器学习和深度学习的Python程序。PyTorch基于Torch,使用Python语言重新编写,使得它更容易使用和扩展。它支持强大…...
CentOS 5/6/7 基于开源项目制作openssh 9.6p1 rpm包—— 筑梦之路
背景介绍 开源项目地址:https://github.com/boypt/openssh-rpms.git 该项目主要支持了centos 5 、6、7版本,针对使用了比较老的操作系统进行openssh安全加固,还是不错的项目,使用简单、一件制作,欢迎大家去支持作者。…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
