数组基础-笔记

news2024/11/17 22:49:17

数组是非常基础的数据结构,实现运用和理解是两回事

数组是存放在连续内存空间上的相同类型的数据的集合

可以方便的通过下表索引的方式获取到下标下对应的数据。

举一个字符数组的例子:

注意两点:

数组下标从0开始

数组内存空间的地址是连续的

正因为数组的内存空间地址连续,索引删除或添加元素时,会移动其他元素地址

例如删除下标为3的元素,需要对下表为3的元素后面的虽有元素都要做移动操作。如图所示

那二位数组在内存的空间地址是连续的么

不同编程语言的内存管理是不一样的。

1.二分查找

. - 力扣(LeetCode)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (right - left) // 2 + left
            num = nums[mid]
            if num == target:
                return mid
            elif num > target:
                right = mid - 1
            else:
                left = mid + 1
        return -1

复杂度分析

  • 时间复杂度:O(log⁡n)O(\log n)O(logn),其中 nnn 是数组的长度。

  • 空间复杂度:O(1)O(1)O(1)。

2.移除元素

. - 力扣(LeetCode)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k
def remove_element(nums, val):
    i = 0    # 初始化一个指针 i 用于遍历数组
    for j in range(len(nums)):    # 遍历数组
        if nums[j]!= val:    # 如果当前元素不等于目标值
            nums[i] = nums[j]    # 将当前元素赋值给指针 i 位置的元素
            i += 1
    return i    # 返回不等于目标值的元素个数

在这里,通过遍历数组,当遇到不等于 val 的元素时,就将其覆盖到前面指针 i 所指向的位置,这样就逐步将不等于 val 的元素往前移动,而等于 val 的元素则被后面的非 val 元素覆盖掉,从而实现了原地移除等于 val 的元素。

如果要获取变更后的数组,可以加一个nums[:i],做截断。

 nums[:i]  # 返回数量和变更后的数组片段
3. 有序数组的平方

. - 力扣(LeetCode)

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
def sorted_squares(nums):
    # 初始化结果列表
    result = []
    # 初始化左右指针
    left = 0
    right = len(nums) - 1
    # 当左指针小于等于右指针时循环
    while left <= right:
        # 如果左指针对应值的平方大于右指针对应值的平方
        if nums[left] ** 2 > nums[right] ** 2:
            result.append(nums[left] ** 2)  # 将左指针对应值的平方加入结果列表
            left += 1  # 左指针右移
        else:
            result.append(nums[right] ** 2)  # 将右指针对应值的平方加入结果列表
            right -= 1  # 右指针左移
    # 反转结果列表使其非递减排序
    return result[::-1]

4.长度最小的子数组

. - 力扣(LeetCode)

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

def min_sub_array_len(target, nums):
    # 初始化左指针
    left = 0
    # 初始化当前子数组和
    cur_sum = 0
    # 初始化最小长度为无穷大
    min_len = float('inf')
    # 遍历数组
    for right in range(len(nums)):
        cur_sum += nums[right]  # 将当前元素加入和
        # 当和大于等于目标值时
        while cur_sum >= target:
            min_len = min(min_len, right - left + 1)  # 更新最小长度
            cur_sum -= nums[left]  # 减去左指针指向的元素
            left += 1  # 左指针右移
    # 如果最小长度还是无穷大,说明没有找到符合条件的子数组,返回 0
    return min_len if min_len!= float('inf') else 0

该算法的时间复杂度为 O(n)。

在这个算法中,我们使用了一个滑动窗口来遍历数组。每次移动窗口时,我们需要计算当前窗口内元素的总和,并判断是否满足条件。这个过程需要遍历窗口内的所有元素,因此时间复杂度为 O(n)。

具体来说,在每次循环中,我们需要执行以下操作:

  1. 计算当前窗口的和:cur_sum += nums[right],这需要 O(1)的时间。
  2. 判断当前窗口的和是否大于等于目标值:while cur_sum >= target,这需要 O(1)的时间。
  3. 更新最小长度:min_len = min(min_len, right - left + 1),这需要 O(1)的时间。
  4. 移动窗口:cur_sum -= nums[left]left += 1,这需要 O(1)的时间。

因此,总的时间复杂度为 O(n),其中 n 为数组的长度。

5.螺旋矩阵II

. - 力扣(LeetCode)

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

def generate_matrix(n):
    # 创建一个 n x n 的全 0 矩阵
    matrix = [[0] * n for _ in range(n)]
    # 初始化当前数字
    num = 1
    # 上下左右边界
    top = 0
    bottom = n - 1
    left = 0
    right = n - 1

    while num <= n * n:
        # 从左到右填充上边界行
        for i in range(left, right + 1):
            matrix[top][i] = num
            num += 1
        top += 1

        # 从上到下填充右边界列
        for i in range(top, bottom + 1):
            matrix[i][right] = num
            num += 1
        right -= 1

        # 从右到左填充下边界行
        for i in range(right, left - 1, -1):
            matrix[bottom][i] = num
            num += 1
        bottom -= 1

        # 从下到上填充左边界列
        for i in range(bottom, top - 1, -1):
            matrix[i][left] = num
            num += 1
        left += 1

    return matrix

总结:

二分法

        二分法是算法面试中的常考题,建议通过这道题目,锻炼自己手撕二分的能力

双指针法

  • (快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
  • 数组在内存中是连续的地址空间,不能释放单一元素,如果要释放,就是全释放(程序运行结束,回收内存栈空间)。

双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组和链表操作的面试题,都使用双指针法。

滑动窗口

  • 滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。
  • 滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)的暴力解法降为O(n)。

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (269)-- 算法导论20.2 4题

四、修改 proto-vEB 结构&#xff0c;以支持重复关键字。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在原始的 van Emde Boas 树&#xff08;vEB tree&#xff09;结构中&#xff0c;关键字&#xff08;key&#xff09;是唯一的&#xff0c;不允许有重复的关…

数据集005:螺丝螺母目标检测数据集(含数据集下载链接)

数据集简介 背景干净的目标检测数据集。 里面仅仅包含螺丝和螺母两种类别的目标&#xff0c;背景为干净的培养皿。图片数量约420张&#xff0c;train.txt 文件描述每个图片中的目标&#xff0c;label_list 文件描述类别 另附一个验证集合&#xff0c;有10张图片&#xff0c;e…

普乐蛙VR大型航天科普馆VR博物馆太空舱模拟体验馆

主题科普馆、学校、家长、同学们看过来&#xff01;&#xff01;想身临其境体验太空漫游、登陆月球、探索月球地貌吗&#xff1f;&#xff01;以新颖有趣的VR设备体验形式&#xff0c;可以在寓教于乐中学习太空知识、亲自收集月球土壤等等。接下来&#xff0c;就让小编带大家乘…

【代码随想录】【算法训练营】【第21天】 [530]二叉搜索树的最小绝对差 [501]二叉搜索树的众数 [236]二叉树的最近公共祖先

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 21&#xff0c;天气不错的周二~ 题目详情 [530] 二叉搜索树的最小绝对差 题目描述 530 二叉搜索树的最小绝对差 解题思路 前提&#xff1a;二叉搜索树 思路&#xff1a;根据二叉搜索树的中…

Vivado打开之前项目仿真过的波形文件

第一步&#xff1a;顶部菜单 点击&#xff1a;Open Static Simulation 然后在弹出的窗口找到.sim结尾的文件夹&#xff0c;在里面找到wdb结尾的文件&#xff0c;点击ok 第二步&#xff1a;依次点击下方红圈 找到wcfg结尾的文件&#xff0c;点击ok即可

Nat Genet|马丁院士团队利用单细胞和空间多组学描绘宫颈鳞癌免疫微环境图谱

宫颈鳞状细胞癌&#xff08;CSCC&#xff09;是宫颈癌最常见的组织学类型。虽然局部疾病预后良好&#xff0c;但晚期、转移性或复发性CSCC的5年生存率仅为16.5%&#xff0c;晚期宫颈癌中对免疫检查点阻断的反应有限。细胞异质性和可塑性是肿瘤进展和肿瘤免疫微环境(TIME)调节的…

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…

Objective-C爬虫:实现动态网页内容的抓取

在当今的互联网时代&#xff0c;数据的获取和分析变得日益重要。无论是进行市场研究、用户行为分析还是产品开发&#xff0c;获取大量数据都是不可或缺的一环。然而&#xff0c;很多有价值的信息都隐藏在动态加载的网页中&#xff0c;这些网页通过JavaScript动态生成内容&#…

【组合数学 放球问题 虚拟点 小于等于转小于】1621. 大小为 K 的不重叠线段的数目

本文涉及知识点 放球问题 组合数学汇总 本题难道分&#xff1a;2198 LeetCode1621. 大小为 K 的不重叠线段的数目 给你一维空间的 n 个点&#xff0c;其中第 i 个点&#xff08;编号从 0 到 n-1&#xff09;位于 x i 处&#xff0c;请你找到 恰好 k 个不重叠 线段且每个线段…

CATIA入门操作案例——波纹管的绘制,自定义参数和公式,定义法则曲线,通过平行曲线绘制正弦曲线

目录 引出波纹管的绘制解决&#xff1a;不显示参数关系 方法一&#xff1a;法则曲线的使用自定义参数和公式 方法二&#xff1a;自己画法则曲线定义法则曲线 方式三&#xff1a;平行曲线画正弦曲线 总结异形弹簧新建几何体草图编辑&#xff0c;画一条样条线进行扫掠&#xff0c…

解决java.nio.file.AccessDeniedException: Permission denied

解决java.nio.file.AccessDeniedException: Permission denied 摘要引言正文1. 理解异常的根本原因2. 检查文件权限3. 处理文件被锁定4. 提升权限或更改文件所有者5. 异常处理 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f…

嵌入式UI开发-lvgl+wsl2+vscode系列:4、动画(Animations)

文章目录 一、前言二、动画示例1、示例1&#xff08;基础按钮label的组合动画&#xff09;2、示例2&#xff08;回放效果动画&#xff09;3、示例3&#xff08;贝塞尔曲线3动画&#xff09;4、示例4&#xff08;动画时间轴&#xff09; 三、最后 一、前言 接下来我们进行动画的…

柯桥成人职场英语/Excuse me 是 “不好意思”,那 Excuse you呢?

口语中&#xff0c;excuse me的使用频率非常高 甚至已经成为大家的口头禅 用在一些表示歉意或者打扰对方的场合 本来excuse me的用法就已经够丰富了 没想到竟然还有excuse you&#xff1f; 哈哈哈&#xff0c;别蒙圈 这篇就给大家捋捋excuse的那些表达 快和小编一起来学学…

TinyEngine 低代码引擎:带你5分钟高效构建游戏登录界面

本文由体验技术团队 TinyEngine 项目成员李旭宏创作&#xff0c;欢迎大家实操体验&#xff0c;本体验项目基于 TinyEngine 低代码引擎提供的环境&#xff0c;通过体验简单拖、拉、拽的形式帮助开发者快速了解低代码引擎的使用流程&#xff0c;达到快速开发游戏登录界面的效果。…

Java Object类方法介绍

Object作为顶级类&#xff0c;所有的类都实现了该类的方法&#xff0c;包括数组。 查询Java文档&#xff1a; 1、object.eauqls(): 其作用与 有些类似。 &#xff1a; 是一个比较运算符&#xff0c;而不是一个方法。 ①可以判断基本类型&#xff0c;也可以判断引用类型。 ②若…

【C++】构造函数、析构函数、拷贝构造与运算符重载

文章目录 1.类的六个默认构造函数2.构造函数2.1特性2.1.1 函数名与类名相同2.1.2. 无返回值&#xff08;不能写void&#xff09;2.1.3. 对象实例化时编译器自动调用对应的构造函数2.1.4 构造函数可以重载2.1.5编译器生成默认的构造函数2.1.6编译器生成的默认构造有何用&#xf…

webserver服务器从零搭建到上线(九)|EpollPoller事件分发器类(一)——详解成员变量、简述成员方法

在本节中&#xff0c;我们一起来仔细探讨一下EpollPoller类。该类可以说是muduo库中最最核心的类了&#xff0c;一定要搞懂&#xff01; 文章目录 私有成员using ChannelList std::vector<Channel*>looping_、quit_threadId_pollReturnTime_、poller_wakeup_fd、wakeupC…

AI赋能:人工智能技术驱动下的品牌海外市场精准分析与营销策略

随着全球化的加速和科技的飞速发展&#xff0c;品牌在海外市场的竞争愈发激烈。为了在竞争激烈的国际市场中脱颖而出&#xff0c;品牌需要更深入地了解海外消费者的行为、趋势和偏好。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理和分析…

3、python安装-linux系统下

安装前置依赖软件&#xff0c;安装完成后&#xff0c;打开官网&#xff0c;下载linux系统下的python安装包&#xff1a; 选择最新的版本 点击最新版本&#xff0c;进入版本对应的界面&#xff0c; 选择第一个进行源码的编译&#xff0c;右键选择复制连接地址&#xff0c; 回到终…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑&#xff0c;为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…