Leetcode刷题笔记1:数组基础1

导语

leetcode刷题笔记记录,本篇博客记录数组基础1部分的题目,主要题目包括:

  • Leetcode 704 二分查找
  • Leetcode 27 移除元素

知识点

二分查找

原理

二分查找的适用对象为有序数组数组中无重复元素,其主要原理是每次都从有序的区间中点开始对比数据,因此其时间复杂度为 O ( l o g N ) O(logN) O(logN).

image.png

易错点

二分查找的易错点主要在边界条件的选取上,比如while中到底使用<还是<=,中点位置索引mid更新时,right = middle呢,还是要right = middle - 1。为此可以使用区间的思想来理解。

一般我们在初始化左右边界时,left=0,但right一般有两种常见的写法:

  1. right = len(nums) - 1;此时,nums[right]是可以取到的,是有意义的,所以mid的取值为左闭右闭区间,[left, right]。
  2. right = len(nums);此时,nums[right]无法取到,是没有意义的,所以mid的取值为左闭右开区间,[left, right)。

对于第一种闭区间的情况,由于左右都可以取到,所以while中的判断条件应该是 left <= right,而在更新right和left时,则分别使用mid+1,mid-1即可。

对于第二种右侧为开区间的情况,由于右边取不到边界值,所以一定有left < right,所以在更新right时,必须使用right = mid。

双指针

原理

双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。如果两个指针方向相反,则称为「对撞指针」。如果两个指针方向相同,则称为「快慢指针」。如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。

在数组的区间问题上,暴力算法的时间复杂度往往是 O ( n 2 ) O(n^2) O(n2)。而双指针利用了区间「单调性」的性质,可以将时间复杂度降到 O ( n ) O(n) O(n)

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

提示:

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

解法

主要的解题思路参考原理部分,这里分别写出两种边界值取法下的代码。

左闭右闭解法

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""# 首先定义左右索引值left, right = 0, len(nums)-1while left <= right:# mid = ( left + right ) // 2mid = ( right - left ) // 2 + left # 避免溢出 if nums[mid] < target:left = mid + 1elif nums[mid] > target:right = mid -1 else:return midreturn -1

左闭右开解法

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""left, right = 0, len(nums)while left < right:mid = ( right - left ) // 2 + leftif nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid return -1

Leetcode 27 移除元素

题目描述

给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1:

输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2]
解释: 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例 2:

输入: nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,4,0,3]
解释: 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

解法

这道题目由于规模不是很大,首先可以使用暴力解法,相关图示参考:示意图

其中使用了两层循环,复杂度为 O ( N 2 ) O(N^2) O(N2)。代码如下:

class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""i, cnt = 0, 0size = len(nums)while i < size - cnt:if nums[i] == val:for j in range(i, size-1):nums[j] = nums[j+1]cnt += 1else:i += 1return size - cnt

之前讲到,使用双指针可以将一些数组区间上的问题转化为 O ( N ) O(N) O(N)复杂度,这里其实也可以使用快慢双指针来解决。我们定义两个指针,一个快指针fast,一个慢指针slow。一开始令两个指针都为0,然后,先移动fast,如果nums[fast]不是要删除的值val,那么移动slow,然后将fast位置的值赋给slow位置。而如果nums[fast]是要删除的值val,那么我们不管这个值,继续移动fast。重复上述过程,fast将遍历整个数组,然后只将不是val的值移动到了前面,而slow则记录了这些值的数目。所以,返回值直接返回slow即可。

相关代码如下:

class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""slow, fast = 0, 0size = len(nums)while fast < size:if nums[fast] != val:nums[slow] = nums[fast]slow += 1fast += 1return slow

参考

  • 代码随想录
  • 二分法
  • 双指针(Two Pointers)用法精讲及解题案例
  • 题解

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

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

相关文章

2024年5月软考架构题目回忆分享

十年架构两茫茫 &#xff0c;Redis , UML 夜来幽梦忽还乡 &#xff0c; 大数据&#xff0c; Lambda 选择题 1.需求分析和架构设计面临这两个不同对象&#xff0c;一个是问题空间&#xff0c;一个是解空间 这是英文题&#xff0c;总共五个题目&#xff0c;只记得这么多 2. …

AI视频教程下载:全面掌握ChatGPT和LangChain开发AI应用(附源代码)

这是一门深入的课程&#xff0c;涉及ChatGPT、LangChain和Python。打造专注于现实世界AI集成的AI应用&#xff0c;课件附有每一节涉及到的源代码。 **你将学到什么&#xff1a;** - 将ChatGPT集成到LangChain的生产风格应用中 - 使用LangChain组件构建复杂的文本生成管道 - …

order by 优化

1. 排序方式 MySQL支持两种方式的排序&#xff0c;FileSort和Index&#xff1a; Index的效率高&#xff0c;它指MySQL根据索引本身完成排序。FileSort方式效率较低&#xff0c;是指MySQL自己扫描数据之后进行排序&#xff0c;没有使用到index 因此&#xff0c;我们要让order…

推荐五个线上兼职,在家也能轻松日入百元,适合上班族和全职宝妈

在这个瞬息万变的时代&#xff0c;你是否也曾考虑过在繁忙的工作之外&#xff0c;寻找一份兼职副业来补贴家用&#xff0c;同时保持生活的多样性&#xff1f;别急&#xff0c;现在就让我为你揭秘五个可靠的日结线上兼职岗位&#xff0c;助你轻松迈向财务自由之路&#xff01; 一…

云WAF与传统WAF:网络安全的双重防线

在网络安全领域&#xff0c;Web应用防火墙&#xff08;WAF&#xff09;是守护企业网络安全的重要盾牌。随着云计算技术的迅猛发展&#xff0c;云WAF作为一种新型的安全服务模式&#xff0c;正逐渐成为企业网络安全防护的新宠。本文将深入探讨云WAF与传统WAF的区别&#xff0c;分…

[‘column‘]和[:,‘column‘]的区别

之前&#xff0c;关于numpy和pandas的操作一直不熟悉&#xff0c;对于获取数据中的行&#xff0c;列一直混淆。 df[column] df[column]是 Pandas DataFrame 切片的常用语法&#xff0c;用于选择名为 column 的单个列。它返回一个 Pandas Series 对象。 df.loc[:,column] df[:,…

PSQL一些查询命令

只看10条数据 select * from dongchazhedata2 limit 10;以某一字段排序 select * from dongchazhedata2 order by date;查询大于某一日期的数据&#xff1b; select * from dongchazhedata where date > 2024-05-19;启动数据库命令 sudo service postgresql start;查看…

使用 Flask 和 Celery 构建异步任务处理应用

文章目录 什么是 Flask&#xff1f;什么是 Celery&#xff1f;如何在 Flask 中使用 Celery&#xff1f;步骤 1&#xff1a;安装 Flask 和 Celery步骤 2&#xff1a;创建 Flask 应用程序步骤 3&#xff1a;运行 Celery Worker步骤 4&#xff1a;启动 Flask 应用程序 结论 在构建…

高校网站群及融媒体中心建设方案

一、项目背景 随着信息技术的飞速发展&#xff0c;互联网已成为高校展示形象、传播信息、服务师生、沟通社会的重要渠道。然而&#xff0c;目前许多高校在网站建设和媒体传播方面存在以下问题&#xff1a; 网站分散、缺乏统一规划&#xff1a;各高校内部往往存在多个部门或学院…

家政项目day3 区域服务模块开发

目录 1 复习下业务流程2 接口设计2.1 查询区域服务2.1.1 接口梳理2.1.2 接口设计2.1.3 接口定义 1 复习下业务流程 区域服务管理是为运营地区设置要运营的服务项&#xff0c;不同地区所运营的服务项可能不同&#xff0c;比如&#xff1a;本平台在北京运营了老人陪护服务&#…

先进制造aps专题七 基于ai大模型的生产调度aps系统

"如果我们能够深度定制并开发出适合这些行业的大模型应用&#xff0c;将会带来巨大的变革。比如在医疗行业&#xff0c;大模型在医学图像分析、疾病预测和智能诊断方面有着广阔的应用前景。通过利用大模型技术&#xff0c;医生可以获得更准确的诊断辅助工具&#xff0c;从…

查数据库表以及视图sql

目录 oracle 数据表 视图 mysql 数据表 视图 hive 表 视图 pg 表 视图 oracle 数据表 SELECT a.owner AS owner,a.TABLE_NAME AS bywm,a.comments AS bzwm FROM all_tab_comments a where a.OWNER NOT IN (SYS, SYSTEM, CTXSYS, XDB, EXFSYS, MDSYS, OL…

零拷贝(Zero-Copy)

1.背景 现在有这样一个场景&#xff0c;我们需要在本地选择一个文件后&#xff0c;然后上传到网络上。 我们再看看文件的内容数据的具体搬运过程&#xff1a; 你会发现&#xff0c;在整个文件搬运的过程中&#xff0c;发生了多次的数据拷贝和上下文转换。 4次数据拷贝&#…

每日一题(5)——StringBuffer操作

编写程序&#xff0c;对StringBuffer对象进行追加&#xff0c;插入和修改缓冲区长度等操作&#xff1b; class StringDemo{public static void main(String[] args){boolean btrue;int i321;long l123456;String s1new String("Hello,world!");StringBuffer s2new S…

Rust一维Vec垂直方向拼接、水平方向拼接,多个二维Vec垂直方向拼接

1.在Rust中&#xff0c;拼接二维Vec通常意味着将多个一维Vec组合成一个二维Vec。假设你想要将多个Vec<T>拼接成一个Vec<Vec<T>>&#xff0c;你可以使用迭代器方法来实现。 下面是一个示例&#xff0c;演示如何将多个一维Vec拼接成一个二维Vec&#xff1a; …

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用&#xff0c;无需在本地设备上进行存储和处…

单片机LCD1602显示电子时钟设计

基于52单片机电子时钟的设计 摘要 本次设计的多功能时钟系统采用STC89C52单片机为核心器件&#xff0c;利用其定时器/计数器定时和记数的原理&#xff0c;结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。将软硬件有机地结合起来&#xff0c;使得系…

汇编实现的操作系统

掌握X86汇编语言和GDB程序调试工具对于程序员来说是非常重要的_gdb 查看x86汇编-CSDN博客 掌握编译器和虚拟机的开发有哪些方面的好处-CSDN博客 Ville Mikael Turjanmaan开发的一个操作系统MenuetOS可运行在IA-32, x86-64平台上&#xff0c;完全用 64 位汇编语言编写。功能包…

Oracle23ai新特性case when子句增加多条件判断

Oracle23ai新特性case when子句增加多条件判断&#xff0c;语句更加灵活易用&#xff0c;更好支持SQL标准。 参考官方文档 CASE Expressions https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-language-fundamentals.html#GUID-216F1B33-493F-4CD…