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

在这里插入图片描述

498. 对角线遍历

class Solution:def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:x, y, m, n, ans = 0, 0, len(mat), len(mat[0]), []for j in range(m*n):ans.append(mat[x][y])if (x + y) % 2 == 0:         # 右上方移动if y == n-1:x += 1        # 第一行elif x == 0:y += 1        # 最后一列else: x -= 1y += 1                   else:if x == m-1: y += 1       # 最后一行elif y == 0: x += 1       # 第一列else: x += 1y -= 1   return ans

在这里插入图片描述

参考文献

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

—— END ——


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

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

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

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

相关文章

带你熟练使用list

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

Nginx map 实现时间格式转换

哈喽大家好&#xff0c;我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上&#xff0c;但是这个平台只支持 JSON 格式&#xff0c;所以需要把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始在主配置文件 nginx.conf 中定义了一个名叫 json 的日志…

2023 蓝帽杯初赛web部分取证复现

前言&#xff1a;初赛进线下了&#xff0c;计划着在决赛前突击学习一下取证&#xff0c;但时间还是太紧 只看了很多内存取证和手机取证 计算机取证和服务器取证没掌握 ---( 不过复赛没考&#xff0c;也算狗运了) 目录 <1> web-LovePHP(file()函数侧信道攻击) <2&g…

在TensorFlow中使用GAN生成图像

一、说明 本文详细论述&#xff0c;如何在tensorflow下&#xff0c;在mnist数据集合上进行GAN实现。包括&#xff1a;框架建立、数据集读出、生成器、鉴别器、代价函数、优化等具体步骤的代码实现。 二、GAN框架介绍 生成器&#xff1a;此组件负责生成新图像。鉴别器&#xf…

《Docker与Kubernetes容器运维实战》简介

#好书推荐##好书奇遇季#《Docker与Kubernetes容器运维实战》已经出版。本书帮助读者系统掌握Docker与K8s运维技能。 本书内容 本书分两部分系统介绍Docker与Kubernetes的运维技术。 &#xff08;1&#xff09;Docker部分包括&#xff1a;全面认识Docker、初步体验Docker、Dock…

Vue记录(下篇)

Vuex getters配置项 *Count.vue <template><div><h1>当前求和为&#xff1a;{{$store.state.sum}}</h1><h3>当前求和的10倍为&#xff1a;{{$store.getters.bigSum}}</h3><select v-model.number"n"><option value&q…

HarmonyOS开发环境搭建

一 鸿蒙简介&#xff1a; 1.1 HarmonyOS是华为自研的一款分布式操作系统&#xff0c;兼容Android&#xff0c;但又区别Android&#xff0c;不仅仅定位于手机系统。更侧重于万物物联和智能终端&#xff0c;目前已更新到4.0版本。 1.2 HarmonyOS软件编程语言是ArkTS&#xff0c…

有哪些编程语言能在AI的应用上大显身手?

人工智能&#xff08;AI&#xff09;是当今最热门的技术领域之一&#xff0c;它涉及到许多不同的子领域&#xff0c;如机器学习、深度学习、自然语言处理、计算机视觉、语音识别等。要开发AI应用&#xff0c;就需要使用一种或多种编程语言&#xff0c;但是&#xff0c;并不是所…

函数式编程汇总

目录 一 . Lambda 表达式 实例 省略规则 二. Stream 流 案例数据准备 入门实例 调试技巧 常用操作 创建流 1. 单例集合 2. 数组 3. 双列集合 中间操作 1. filter 2. map 3. distinct 4. sorted 5. limit 7. flatMap 终结操作 1. forEach 2. count 3. max…

再战SDRAM与资料整理。

总之只要阅读操作手册&#xff0c;按照时序来&#xff0c;完全不难&#xff01; 器件记录&#xff1a; 小梅哥AC620上SDRAM&#xff1a;M12L2561616A-6TG2T 其的存储空间为16M*16256MB&#xff0c;第二行的数字则与其速度等级有关&#xff1b;其分为&#xff1a; 4bank*16bit…

ES6的代理模式 | Proxy

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 正文 语法 Handler 对象常用的方法 handler.get 可撤消的Proxy Proxy的应用场景 校验器 私有属性 为什么要…

【eXtplorer】本地搭建免费在线文件管理器并实现在外远程登录

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是…

Java的XWPFTemplate工具类导出word.docx的使用

依赖 <!-- word导出 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency><!-- 上面需要的依赖--><dependency><groupId>org.ap…

【MySQL】基础SQL语句——库的操作

文章目录 一. 创建数据库1.1 基础语句1.2 字符集和校验规则1.3 校验规则对读取数据的影响 二. 查看数据库三. 修改数据库四. 删除数据库及备份4.1 删除4.2 备份和还原 结束语 一. 创建数据库 1.1 基础语句 最简洁的创建数据库的SQL语句是&#xff1a; create database db_nam…

Linux设备驱动模型之platform设备

Linux设备驱动模型之platform设备 上一章节介绍了Linux字符设备驱动&#xff0c;它是比较基础的&#xff0c;让大家理解Linux内核的设备驱动是如何注册、使用的。但在工作中&#xff0c;个人认为完全手写一个字符设备驱动的机会比较少&#xff0c;更多的都是基于前人的代码修修…

深入理解Serverless架构:构建无服务器应用的完全指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Serverless架构是一种现…

AOSP Android 系统源码编译出的framework.jar和android.jar之间的区别

简介 AOSP&#xff08;Android Open Source Project&#xff09;编译出的 android.jar 和 framework.jar 都是 Android 平台开发中的重要组件&#xff0c;但它们有不同的作用和用途&#xff1a; android.jar&#xff1a; 用途&#xff1a;android.jar 包含了 Android API 的定…

远程计算机控制软件

远程控制软件允许您连接和控制位于不同位置的设备&#xff0c;对于 IT 帮助台技术人员来说&#xff0c;这是一个很好的工具&#xff0c;可以通过与用户协作、与他们聊天以及安全地访问他们的文件来轻松排除故障和修复远程设备。使用远程控制软件&#xff0c;距离不再是提供技术…

LVS + Keepalived群集

文章目录 1. Keepalived工具概述1.1 什么是Keepalived1.2 工作原理1.3 Keepailved实现原理1.4 Keepalived体系主要模块及其作用1.5 keepalived的抢占与非抢占模式 2. 脑裂现象 &#xff08;拓展&#xff09;2.1 什么是脑裂2.2 脑裂的产生原因2.3 如何解决脑裂2.4 如何预防脑裂 …

VMware虚拟机如何设置网络

一直没弄明白怎么能让虚拟机正常上网和访问&#xff0c;最近总结一个小经验 要在宿主机访问虚拟机电脑服务器&#xff0c;要设置成nat格式&#xff0c;虚拟机可以上网&#xff0c;宿主机访问虚拟机上的ip即可访问虚拟机里的服务器&#xff0c;也就是这样设置就行。 这时候ip不…