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.hqwc.cn/news/108738.html

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

相关文章

13-RocketMQ主从同步(HA实现)源码原理

目录 HAClient端 Master端 AcceptSocketService实现原理 HAConnection实现原理 ReadSocketService WriteSocketService GroupTransferService实现原理 五大线程的协调关系 HAClient端 首先要去connect一下master&#xff0c;从而建立一个SocketChannel连接通道&#x…

不知道有用没用的Api

encodeURIComponent(https://www.baidu.com/?name啊啊啊) decodeURIComponent(https%3A%2F%2Fwww.baidu.com%2F%3Fname%3D%E5%95%8A%E5%95%8A%E5%95%8A) encodeURI(https://www.baidu.com/?name啊啊啊) decodeURI(https://www.baidu.com/?name%E5%95%8A%E5%95%8A%E5%95%8A) …

面试核心技巧--spring篇

答题技巧&#xff1a; 总&#xff1a;当前问题的是那些具体点 分&#xff1a;1、2、3、4突出重点&#xff0c; 避重就轻:没有重点 一个问题能占用面试官多少时间?问的越多可能露馅越多 当面试官问到一个你熟悉的点的时候&#xff0c;一定要尽量拖时间 什么是底层实现&#…

真空腔体的设计要点

真空腔体是保持内部为真空状态的容器&#xff0c;真空腔体设计制作要考虑容积、材质和形状。 1、根据应用需求选择腔体形状。几种代表性的真空腔体包括垂直真空腔体、水平真空腔体、立方真空腔体和球形真空腔体。 2、根据获得真空度选择腔体材质。钛用于极高真空&#xff1b;…

旋转偏心裁切刀切向跟踪及半径补偿

1 裁刀半径补偿问题的提出 偏心裁刀一般皮革和纸箱行业用的比较多&#xff0c;它适用于裁切比较厚的材料。对于如图1所示的偏心裁刀&#xff0c;它的刀尖和旋转轴(也就是刀心)存在一个距离&#xff0c;设为半径r。由于改刀刀刃有方向&#xff0c;所以用该刀去切割直线时&#…

Linux学习笔记-Ubuntu系统下配置用户ssh只能访问git仓库

目录 一、基本信息1.1 系统信息1.2 git版本[^1]1.2.1 服务器端git版本1.2.2 客户端TortoiseGit版本1.2.3 客户端Git for windows版本 二、创建git用户和群组[^2]2.1 使用groupadd创建群组2.2 创建git用户2.2.1 使用useradd创建git用户2.2.2 配置新建的git用户ssh免密访问 2.3 创…

Packet Tracer安装、汉化

Packet Tracer是一款由思科系统开发的网络模拟器&#xff0c;用于学习和实验网络配置、协议和拓扑结构。它提供了一个虚拟的网络环境&#xff0c;让用户能够在不需要实际硬件设备的情况下进行网络实验和模拟。 安装 Packet Tracer的安装注册&#xff1a;在Packet Tracer软件上…

基于SSM的快餐店点餐服务系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

2023 CCF国际AIOps挑战赛,报名倒计时!|截止时间9月15日

智能运维领域最具影响力的专业赛事——2023 CCF国际AIOps挑战赛&#xff0c;自报名启动以来已收到230余支队伍报名&#xff0c;约600余位选手参与本次挑战赛。本次大赛的报名截止时间为9月15日&#xff0c;目前报名已经进入倒计时&#xff0c;请选手们抓紧最后时间报名参赛&…

Science adv | 转录因子SPIC连接胚胎干细胞中的细胞代谢与表观调控

代谢是生化反应网络的结果&#xff0c;这些反应吸收营养物质并对其进行处理&#xff0c;以满足细胞的需求&#xff0c;包括能量产生和生物合成。反应的中间体被用作各种表观基因组修饰酶的底物和辅助因子&#xff0c;因此代谢与表观遗传密切相关。代谢结合表观遗传涉及疾病&…

使用Puppeteer爬取地图上的用户评价和评论

导语 在互联网时代&#xff0c;获取用户的反馈和意见是非常重要的&#xff0c;它可以帮助我们了解用户的需求和喜好&#xff0c;提高我们的产品和服务质量。有时候&#xff0c;我们需要从地图上爬取用户对某些地点或商家的评价和评论&#xff0c;这样我们就可以分析用户对不同…

Linux下修改jar包中的配置文件application.conf

文件位置 jar包文件工程目录 打包后解压jar包目录 提取和上传 jar tf XXX.jar # 获取包内文件 application.conf是jar包的配置文件&#xff0c;如果修改需要 提取文件 jar xf my-app.jar application.conf 修改后上传文件 jar uf my-app.jar application.conf