Leetcode算法入门与数组丨3. 数组基础

文章目录

    • 前言
    • 1 数组简介
    • 2 数组的基本操作
      • 2.1 访问元素
      • 2.2 查找元素
      • 2.3 插入元素
      • 2.4 改变元素
      • 2.5 删除元素
    • 3 总结
    • task03
    • task04

前言

Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记

这篇博客是一个 入门型 的文章,主要是自己学习的一个记录。

内容会参考这篇笔记(很详细):LeetCode 算法笔记(Leetcode-Notes)

1 数组简介

数组定义

数组(Array):一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据,是实现线性表的顺序结构存储的基础。

  • 线性表:相同类型的数据元素排成线一样的结构,每个元素最多有前、后两个方向。数**组、栈、队列、链表 **都是线性表结构。
  • 连续的内存空间:线性表中顺序存储结构,占用的内存空间连续,也就是说相邻数据元素之间,物理内存上的存储位置相邻。

随机访问数据元素

数组可以根据下标,直接随机指定到某一个元素存放的位置进行访问,也就是说数组具有随机访问的特点。

在定义数组的时候,首先计算机会给数组分配一组连续的存储空间,其中第一个元素的地址称为首地址,之后的元素都具有下标索引和内存地址。计算机通过地址来访问数据元素,并通过寻址公式计算出对应元素的内存地址。

寻址公式
下标 i 对应的数据元素地址 = 数组首地址 + i × 单个数据元素所占内存大小 下标 i 对应的数据元素地址 = 数组首地址 + i \times 单个数据元素所占内存大小 下标i对应的数据元素地址=数组首地址+i×单个数据元素所占内存大小
多维数组

上面介绍的数组只有一个维度,是一维数组,其数据元素也是单下标索引。

在实际生活中,经常会遇到二维或者多为的数据,那么这些数据的存储可能就会用到多维数组。例如二维数组,可以看作是一个特殊的一维数组,即一维数组中的元素也是一个数组。

不同编程语言中数组的实现

不同编程语言中数组的实现可能会有所不同,以下是几种常见编程语言中数组的实现方式:

  1. C语言:C语言中的数组是一组相同类型的连续内存空间。可以通过声明数组变量并指定大小来创建数组,例如: int arr[5]; 。数组元素可以通过索引访问,索引从0开始,例如: arr[0] = 10; 。

  2. Java:Java中的数组也是一组相同类型的连续内存空间。可以通过声明数组变量并使用 new 关键字来创建数组,例如: int[] arr = new int[5]; 。数组元素同样可以通过索引访问,例如: arr[0] = 10; 。

  3. Python:Python中的数组可以使用列表(List)来实现。列表可以包含不同类型的元素,并且可以动态调整大小。可以使用方括号创建列表,例如: arr = [1, 2, 3, 4, 5] 。可以通过索引访问和修改列表元素,例如: arr[0] = 10 。

  4. JavaScript:JavaScript中的数组也可以使用方括号创建,例如: var arr = [1, 2, 3, 4, 5]; 。与Python类似,JavaScript数组可以包含不同类型的元素,并且可以动态调整大小。可以通过索引访问和修改数组元素,例如: arr[0] = 10; 。

2 数组的基本操作

增、删、改、查 基本上涉及这四种操作。

2.1 访问元素

访问数组中第 i i i 个元素:

  1. 检查 i i i 的范围是否在合法的区间内,即 0 ≤ i ≤ l e n ( n u m s ) − 1 0\le i \le len(nums)-1 0ilen(nums)1 。超出范围内的访问为非法访问。
  2. 如果是合法访问,则由给定下标得到元素值。
# 从数组 nums 中读取下标为 i 的数据元素值
def value(nums, i):if 0 <= i <= len(nums) - 1:print(nums[i])arr = [0, 5, 2, 3, 7, 1, 6]
value(arr, 3)

2.2 查找元素

查找数组中元素值为 v a l val val 的位置:

  1. 建立一个基于下标的循环,每次将 v a l val val 与当前数据元素 n u m s [ i ] nums[i] nums[i] 进行比较。
  2. 在找到元素的时候返回元素下标。
  3. 遍历完找不到时可以返回一个特殊值(例如 −1)。
# 从数组 nums 中查找元素值为 val 的数据元素第一次出现的位置
def find(nums, val):for i in range(len(nums)):if nums[i] == val:return ireturn -1arr = [0, 5, 2, 3, 7, 1, 6]
print(find(arr, 5))

2.3 插入元素

添加元素到列表末尾:

arr = [1, 2, 3, 4, 5]
arr.append(6)
print(arr)  # 输出:[10, 2, 3, 4, 5, 6]

插入元素到指定位置:

arr = [1, 2, 3, 4, 5]
arr.insert(2, 7)  # 在索引为2的位置插入元素7
print(arr)  # 输出:[10, 2, 7, 3, 4, 5, 6]

2.4 改变元素

将元素中第 i i i 个元素值改为 v a l val val

  1. 检查 i i i 的范围是否在合法的区间内,即 0 ≤ i ≤ l e n ( n u m s ) − 1 0\le i \le len(nums)-1 0ilen(nums)1 。超出范围内的访问为非法访问。
  2. 如果是合法访问,则将第 i i i 个元素值赋值为 v a l val val
def change(nums, i, val):if 0 <= i <= len(nums) - 1:nums[i] = valarr = [0, 5, 2, 3, 7, 1, 6]
i, val = 2, 4
change(arr, i, val)
print(arr)

2.5 删除元素

Python中删除数组元素的几种常见方法:

  1. 删除数组尾部元素:
arr = [1, 2, 3, 4, 5]
arr.pop()  # 删除并返回最后一个元素
print(arr)  # 输出:[1, 2, 3, 4]
  1. 删除数组指定位置上的元素:(首先要检查下标是否合法,合法之后再进行之后操作)
arr = [1, 2, 3, 4, 5]
arr.pop(2)  # 删除索引为2的元素
print(arr)  # 输出:[1, 2, 4, 5]
  1. 基于条件删除元素:
arr = [1, 2, 3, 4, 5]
arr.remove(3)  # 删除所有等于3的元素
print(arr)  # 输出:[1, 2, 4, 5]

3 总结

数组作为最基本的顺序结构存储方式,支持随机访问。在执行增删改查操作时,不同的操作对于时间复杂度的影响也不同。

当涉及到数组的增删改查操作时,不同操作的时间复杂度会有所不同。以下是一些示例:

  1. 访问元素(随机访问):
  • 时间复杂度:O(1)
  • 无论数组多大,通过索引直接访问元素的时间是恒定的,因为数组元素在内存中是连续存储的。例如,访问数组中的第一个元素或最后一个元素都只需要一步操作。
  1. 插入元素:
  • 在数组的末尾插入元素:

    • 时间复杂度:O(1)
    • 当在数组末尾插入元素时,只需要将元素添加到数组的最后一个位置。
  • 在数组的其他位置插入元素:

    • 时间复杂度:O(n)
    • 当在数组的其他位置插入元素时,需要将插入位置后面的所有元素向后移动一位,以腾出空间插入新元素。
  1. 删除元素:
  • 删除数组末尾的元素:

    • 时间复杂度:O(1)
    • 当删除数组末尾的元素时,只需要将数组的长度减一即可。
  • 删除数组的其他位置的元素:

    • 时间复杂度:O(n)
    • 当删除数组的其他位置的元素时,需要将删除位置后面的所有元素向前移动一位,以填补删除的空缺。
  1. 修改元素:
  • 时间复杂度:O(1)
  • 通过索引直接访问并修改数组中的元素,时间复杂度为常数。

task03

0066. 加一

class Solution:def plusOne(self, digits: List[int]) -> List[int]:digits = [0] + digitsdigits[len(digits)-1] += 1for i in range(len(digits)-1, 0, -1):if digits[i] != 10:breakelse:digits[i] = 0digits[i-1] += 1if digits[0] == 0:return digits[1:]else:return digits

在这里插入图片描述

0724. 寻找数组的中心下标

class Solution:def pivotIndex(self, nums: List[int]) -> int:sum = 0for i in range(len(nums)):sum += nums[i]sum_t = 0for i in range(len(nums)):if sum_t * 2 + nums[i] == sum:return isum_t += nums[i]return -1

在这里插入图片描述

0189. 轮转数组

class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n = len(nums)k = k % nself.reverse(nums, 0, n-1)self.reverse(nums, 0, k-1)self.reverse(nums, k, n-1)def reverse(self, nums: List[int], left: int, right: int) ->None:while left < right :temp = nums[left]nums[left] = nums[right]nums[right] = templeft += 1right -= 1

在这里插入图片描述

task04

48. 旋转图像

class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""n = len(matrix)matrix_new = [[0] * n for _ in range(n)]for i in range(n):for j in range(n):matrix_new[j][n-i-1] = matrix[i][j]matrix[:] = matrix_new

在这里插入图片描述

54. 螺旋矩阵

class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:if not matrix: return []l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []while True:for i in range(l, r+1): res.append(matrix[t][i])t += 1if t > b : breakfor i in range(t, b+1): res.append(matrix[i][r])r -= 1if l > r: breakfor i in range(r, l-1, -1): res.append(matrix[b][i])b -= 1if t > b: breakfor i in range(b, t-1, -1): res.append(matrix[i][l])l += 1if l > r: breakreturn res

在这里插入图片描述

参考文献

  • [1] https://datawhalechina.github.io/leetcode-notes/#/

—— END ——


如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留言。或者你有更好的想法,欢迎一起交流学习~~~

更多精彩内容请前往 AXYZdong的博客

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

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

相关文章

SSM SpringBoot vue快递柜管理系统

SSM SpringBoot vue快递柜管理系统 系统功能 登录 注册 个人中心 快递员管理 用户信息管理 用户寄件管理 配送信息管理 寄存信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端: vue 数据库&#xff1a;Mys…

【GAMES202】Real-Time Ray Tracing 1—实时光线追踪1

一、前言 这篇我们开始新的话题—Real-Time Ray Tracing简称RTRT&#xff0c;也就是实时光线追踪&#xff0c;关于光线追踪&#xff0c;我们已经不止一次提到过它的优点&#xff0c;无论是软阴影还是全局光照&#xff0c;光线追踪都很容易做&#xff0c;唯一的缺点就是速度太慢…

快速加入Health Kit,一文了解审核流程

HUAWEI Health Kit是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台。 在获取用户授权后&#xff0c;开发者可以使用Health Kit提供的开放能力获取运动健康数据&#xff0c;基于多种类型数据构建运动健康领域应用与服务&#xff0c;为用户打造丰富、便捷、…

模方新建工程时,显示空三与模型坐标系不一致怎么解决

答:检查空三xml与模型的metadata.xml的坐标系是否一致&#xff0c;metadata文件是否有在data目录外面。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.0新增单体化建模模块&#xff0c;…

【C语言】每日一题(半月斩)——day2

目录 一.选择题 1、以下程序段的输出结果是( ) 2、若有以下程序&#xff0c;则运行后的输出结果是&#xff08; &#xff09; 3、如下函数的 f(1) 的值为&#xff08; &#xff09; 4、下面3段程序代码的效果一样吗( ) 5、对于下面的说法&#xff0c;正确的是&#xf…

Kotlin

函数命名 针对您目前为止学到的 Kotlin 知识&#xff0c;下面给出了一些相关样式指南&#xff1a; 函数名称应采用驼峰式大小写形式&#xff0c;并且应该是动词或动词短语。每个语句都应单独占一行。左花括号应出现在函数开始行的末尾。左花括号前应有一个空格。 变量声明 变…

千兆以太网硬件设计及链路层 MAC 协议格式

以太网系列文章&#xff1a; &#xff08;1&#xff09;千兆以太网硬件设计及链路层 MAC 协议格式 &#xff08;2&#xff09;千兆以太网网络层 ARP 协议的原理与 FPGA 实现 &#xff08;3&#xff09;CRC校验代码原理 文章目录 前言一、以太网 MAC 层接口介绍1.MII 接口2.GMII…

重建大师提交空三后引擎状态是等待,怎么开启?

答&#xff1a;图片中这是在自由网空三阶段&#xff0c;整个AT都是等待中&#xff0c;可以修改任务目录和监控目录看一下&#xff0c;先设置引擎&#xff0c;再提交空三。

可变参数JAVA

public class Main {public static void main(String[] args) {//方法形参的个数是可以变化的//格式&#xff1a;属性类型...名字System.out.println(getSum(1,2,3,4,5,6,7,8));}//通过键值对对象来遍历&#xff1b;public static int getSum(int a,int...args){//可变参数;int…

IDEA2023.2.1取消空包隐藏,切换包结构(Compact Middle Packages)

解决2023版idea的包结构 取消勾选即可。 取消勾选Compact Middle Packages选项后&#xff0c;再创建包时&#xff0c;即可自动创建树形结构。 仅供学习使用&#xff01;

IP地址,子网掩码,默认网关,DNS讲解

IP地址&#xff1a;用来标识网络中一个个主机&#xff0c;IP有唯一性&#xff0c;即每台机器的IP在全世界是唯一的。 子网掩码&#xff1a;用来判断任意两台计算机的ip地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行and运算后&#x…

黑马头条 热点文章实时计算、kafkaStream

热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算kafkaStream概述kafkaStream入门案例Springboot集成kafkaStream 实时计算 用户行为发送消息kafkaStream聚合处理消息更新文章行为数量替换热点文章数据 2 实时流式计算 2…

医学访问学者申请四点规划建议

医学领域一直以来都是人类社会的重要组成部分&#xff0c;而作为一名有志于成为一名医学领域的访问学者&#xff0c;您需要明确自己的目标并做好充分准备。知识人网小编将为您提供四点规划建议&#xff0c;以帮助您成功申请医学访问学者的机会。 第一点&#xff1a;明确研究方向…

OOM分析实战

OOM分析&实战 OOM分析&实战引言&#xff1a;一、JVM内存结构二、JVM OOM错误情况三、实践案例一案例二案例三 四、总结五、分析工具推荐六、参考文献 OOM分析&实战 引言&#xff1a; 在Java开发中&#xff0c;随着应用程序变得越来越复杂&#xff0c;内存管理问题…

Debian11之稳定版本Jenkins安装

系统要求 机器要求 256 MB 内存&#xff0c;建议大于 512 MB 10 GB 的硬盘空间&#xff08;用于 Jenkins 和 Docker 镜像&#xff09;软件要求 Java 8 ( JRE 或者 JDK 都可以) Docker &#xff08;导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载 Maven 用于构…

【循环冗余码检错示例】

接收方怎么看有错没有 余数为0就是无错&#xff01;

低代码框架开发平台厂家:做好产品,实现流程化办公!

在新的发展时代&#xff0c;低代码技术平台拥有诸多优势特点&#xff0c;成为广大企业实现降本、增效办公效率的得力助手。什么样的低代码框架开发平台厂家值得信任与青睐&#xff1f;都有哪些主要产品&#xff1f;为了帮助大家了解这一讯息&#xff0c;一起来了解流辰信息低代…

记录一次使用网云穿实现内网穿透操作

记录一次使用网云穿实现内网穿透操作 摘要 这段时间也很少写博客了,一方面工作表较忙,一方面觉得有些东西在百度上都能找到,甚至比我自己记录的详细,有些笔记也就没打, 这次记录笔记主要是觉得这个 网云穿 很好用,分享给大家. 1 什么是内网穿透? 内网穿透也叫内网映射&#xf…

JetBrains设置inline hint的背景色、前景色

如题。修改IDE的hint前景色和背景色。 修改后结果&#xff1a;

2023/9/14 -- C++/QT

作业&#xff1a; 仿照Vector实现MyVector&#xff0c;最主要实现二倍扩容 #include <iostream>using namespace std;template <typename T> class MyVector { private:T *data;size_t size;size_t V_capacity; public://无参构造MyVector():data(nullptr),size(…