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

news2024/11/23 11:51:45

文章目录

    • 前言
    • 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 i
    return -1

arr = [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] = val
        
arr = [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] + digits
        digits[len(digits)-1] += 1
        for i in range(len(digits)-1, 0, -1):
            if digits[i] != 10:
                break
            else:
                digits[i] = 0
                digits[i-1] += 1

        if digits[0] == 0:
            return digits[1:]
        else:
            return digits

在这里插入图片描述

0724. 寻找数组的中心下标

class Solution:
    def pivotIndex(self, nums: List[int]) -> int:
        sum = 0
        for i in range(len(nums)):
            sum += nums[i]
        sum_t = 0
        for i in range(len(nums)):
            if sum_t * 2 + nums[i] == sum:
                return i
            sum_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 % n
        self.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] = temp
            left += 1
            right -= 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 += 1
            if t > b : break
            for i in range(t, b+1): res.append(matrix[i][r])
            r -= 1
            if l > r: break
            for i in range(r, l-1, -1): res.append(matrix[b][i])
            b -= 1
            if t > b: break
            for i in range(b, t-1, -1): res.append(matrix[i][l])
            l += 1
            if l > r: break

        return res

在这里插入图片描述

参考文献

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

—— END ——


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

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

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

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

相关文章

Matlab图像处理-三原色

三原色 根据详细的实验结果&#xff0c;人眼中负责颜色感知的细胞中约有65%对红光敏感&#xff0c;33%对绿光敏感&#xff0c;只有2%对蓝光敏感。正是人眼的这些吸收特性决定了所看到的彩色是一般所谓的原色红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;和蓝&…

十四、流式编程(1)

本章概要 流支持流创建 随机数流int 类型的范围generate()iterate()流的建造者模式Arrays正则表达式 集合优化了对象的存储&#xff0c;而流&#xff08;Streams&#xff09;则是关于一组组对象的处理。 流&#xff08;Streams&#xff09;是与任何特定存储机制无关的元素序列…

【2023】windows下安装libevent

Windows安装libevent 1.安装Visual Studio2.安装openssl第一种安装方式&#xff1a;[简便安装](https://slproweb.com/products/Win32OpenSSL.html)第二种&#xff1a;自己编译openssl 3.libevent下载libevent修改文件1.下边三个文件加入宏定义 #define _WIN32_WINNT 0x05002.修…

基于卷积神经网络的手写字体识别(详细笔记)

主要参考博客&#xff1a; 1、 基于卷积神经网络的手写数字识别&#xff08;附数据集完整代码操作说明&#xff09; 2、用PyTorch实现MNIST手写数字识别&#xff08;最新&#xff0c;非常详细&#xff09; 基于卷积神经网络的手写字体识别——目录 1 前言1.1 实现效果1.2 学习背…

国产洗碗机打响超越战

“征服世界的将是这样一些人&#xff1a;开始的时候&#xff0c;他们试图找到梦想中的乐园。最终&#xff0c;当他们无法找到时&#xff0c;就亲自创造了它。”诺贝尔文学奖获得者萧伯纳的这句话&#xff0c;适用于许多中国行业和企业&#xff0c;洗碗机就是其中之一。 对热爱…

十进制小数转换为单双精度浮点数方法

1 将十进制小数转换为单精度浮点数的方法如下&#xff1a; 2. 将十进制小数转换为双精度浮点数的方法如下&#xff1a; 和单精度浮点值转换一样

前端Layui框架介绍

当涉及到前端UI框架时&#xff0c;Layui&#xff08;简称layui&#xff09;是一个备受欢迎的框架之一。在这篇博客中&#xff0c;我们将深入了解layui&#xff0c;包括其市场占有率、开发语言、使用场景、框架特点以及一些使用案例。 1. 市场占有率 Layui 是一款流行的前端UI框…

(纯干货建议收藏)大型字符串模拟-超强超全函数技巧总结

这篇文章将会总结一些处理字符串、进制转换等等的常见的、非常有用的技巧和函数。后续会随时更新本文章&#xff0c;希望大家收藏、留言&#xff0c;一起学习进步&#xff01; 对于特别简单的函数&#xff0c;就不写函数的详细原型啦&#xff01; 具体包含四部分&#xff0c;…

Xilinx FPGA未使用管脚上下拉状态配置(ISE和Vivado环境)

文章目录 ISE开发环境Vivado开发环境方式1&#xff1a;XDC文件约束方式2&#xff1a;生成选项配置 ISE开发环境 ISE开发环境&#xff0c;可在如下Bit流文件生成选项中配置。 右键点击Generate Programming File&#xff0c;选择Process Properties&#xff0c; 在弹出的窗口选…

《程序员职场工具库》如何优化你的工作 —— PDCA 循环

PDCA 循环简介 PDCA 循环是一种以持续改进为核心思想的管理方法&#xff0c;在全球各个领域得到广泛的应用。它还有好几个别称&#xff0c;叫“质量环”&#xff0c;也叫“戴明环”&#xff0c;也有叫“持续改进螺旋”。 PDCA 循环由四个步骤组成&#xff1a; 计划&#xff…

基于SSM+Vue的中国咖啡文化宣传网站

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

vector模拟实现——关于模拟中的易错点

前言 vector 本质上类似数组&#xff0c;也可以理解为一种泛型的 string。string 只能存储 char 类型&#xff0c;但是 vector 支持各种内置类型和自定义类型。本次将围绕模拟实现 vector 中遇到的问题进行分析。 文章目录 前言一、确定思路二、实现过程2.1 查阅文档2.2 验证…

4-3 nn.functional和nn.Module

一&#xff0c;nn.functional 和 nn.Module 前面我们介绍了Pytorch的张量的结构操作和数学运算中的一些常用API。利用这些张量的API我们可以构建出神经网络相关的组件(如激活函数&#xff0c;模型层&#xff0c;损失函数)。 其实&#xff1a;Pytorch和神经网络相关的功能组件大…

中小企业数字化转型难?为什么不试试“企业级”无代码平台

首先&#xff0c;让我们思考一下&#xff0c;中小企业为什么要进行数字化转型&#xff1f;随着全球经济的数字化趋势日益明显&#xff0c;中小企业作为经济的重要组成部分&#xff0c;其数字化转型已成为推动经济高质量发展的关键。数字技术可以帮助中小企业提高生产效率、降低…

ctfshow-web-红包题 辟邪剑谱

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库溯源相关 文中工具皆可关注 皓月当空w 公众号 发送关键字 工具 获取 0x01 题目 0x02 Write Up 这道题主要是考察mysql查询绕过的问题。 首先访问后看到是一个登录页面&#xff0c;测试注册等无果 扫描目录&#xff0c;发…

Packet Tracer的使用介绍

直接访问 Packet Tracer 的帮助页面、教程视频和在线资源对于了解该软件会更加方便。 单击菜单工具栏右上角的问号图标。单击“帮助”菜单&#xff0c;然后选择“内容”。 b. 通过单击“帮助”>“教程”来访问 Packet Tracer 的教程视频。 菜单栏&#xff1a;提供文件、编辑…

SpringBoot运行原理

目录 SpringBootApplication ComponentScan SpringBootConfiguration EnableAutoConfiguration 结论 SpringbootApplication&#xff08;主入口&#xff09; SpringBootApplication public class SpringbootConfigApplication {public static void main(String[] args) {…

Android动态片段

之前创建的片段都是静态的。一旦显示片段&#xff0c;片段的内容就不能改变了。尽管可以用一个新实例完全取代所显示的片段&#xff0c;但是并不能更新片段本身的内容。 之前已经创建过一个基础秒表应用&#xff0c;具体代码https://github.com/MADMAX110/Stopwatch。我们将这个…

发生以下的报错怎么办?

报错问题&#xff1a; 解决办法&#xff1a; 根据你提供的代码和错误信息&#xff0c;问题出在使用了nullptr。这个错误是因为你的编译器不支持C11标准。 nullptr是C11引入的空指针常量。为了解决这个问题&#xff0c;你可以尝试以下两种方法之一&#xff1a; 1. 将nullptr…

想要精通算法和SQL的成长之路 - 可以攻击国王的皇后

想要精通算法和SQL的成长之路 - 可以攻击国王的皇后 前言一. 可以攻击国王的皇后 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 可以攻击国王的皇后 原题链接 这个题目其实并没有涉及到什么很难的算法&#xff0c;其实就是一个简单的遍历题目。核心思想&#xff1a; 以…