数组基础-笔记

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

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

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

举一个字符数组的例子:

注意两点:

数组下标从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) - 1while left <= right:mid = (right - left) // 2 + leftnum = nums[mid]if num == target:return midelif num > target:right = mid - 1else:left = mid + 1return -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 += 1return 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 = 0right = 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  # 左指针右移# 如果最小长度还是无穷大,说明没有找到符合条件的子数组,返回 0return 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 = 0bottom = n - 1left = 0right = n - 1while num <= n * n:# 从左到右填充上边界行for i in range(left, right + 1):matrix[top][i] = numnum += 1top += 1# 从上到下填充右边界列for i in range(top, bottom + 1):matrix[i][right] = numnum += 1right -= 1# 从右到左填充下边界行for i in range(right, left - 1, -1):matrix[bottom][i] = numnum += 1bottom -= 1# 从下到上填充左边界列for i in range(bottom, top - 1, -1):matrix[i][left] = numnum += 1left += 1return matrix

总结:

二分法

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

双指针法

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

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

滑动窗口

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

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

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

相关文章

yarn dev启动项目时遇到的问题

用yarn dev启动项目的时候&#xff0c;遇到了如下问题&#xff1a; 这个时候&#xff0c;我们可以这样解决&#xff1a;用nvm list 看下已安装的node版本&#xff0c;用nvm use切换一下node版本&#xff0c;当然前提是你已经安装了nvm。

C++: 二叉搜索树及实现

目录 一、二叉搜索树的概念 二、二叉搜索树的操作 2.1插入 2.2删除 1.有左子树&#xff0c;无右子树 2.有右子树&#xff0c;无左子树 3.有左子树和右子树 三、二叉搜索树的实现 要点 前言&#xff1a;为了学习map和set&#xff0c;需要先学二叉搜索树作为铺垫。 一、…

[论文笔记]Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

引言 今天带来思维链论文 Chain-of-Thought Prompting Elicits Reasoning in Large Language Models的笔记。 作者探索了如何通过生成一系列中间推理步骤的思维链&#xff0c;显著提升大型语言模型在进行复杂推理时的能力。 1 总体介绍 语言模型的规模扩大已被证明能够带来…

[数据集][目标检测]伤口检测数据集VOC+YOLO格式2760张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2760 标注数量(xml文件个数)&#xff1a;2760 标注数量(txt文件个数)&#xff1a;2760 标注…

课时138:变量进阶_变量实践_综合案例

2.1.3 综合案例 学习目标 这一节&#xff0c;我们从 免密认证、脚本实践、小结 三个方面来学习 免密认证 案例需求 A 以主机免密码认证 连接到 远程主机B我们要做主机间免密码认证需要做三个动作1、本机生成密钥对2、对端机器使用公钥文件认证3、验证手工演示 本地主机生成…

调整GIF图大小的方法是什么?分享4个

调整GIF图大小的方法是什么&#xff1f;在数字化时代&#xff0c;GIF以其独特的动图魅力&#xff0c;成为了网络交流中不可或缺的一部分。无论是社交媒体、博客文章还是工作汇报&#xff0c;一个恰到好处的GIF图往往能有效吸引观众的注意&#xff0c;传递信息&#xff0c;但过大…

YOLOv8+PyQt5面部表情检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.资源包含可视化的面部表情检测系统&#xff0c;基于最新的YOLOv8训练的面部表情检测模型&#xff0c;和基于PyQt5制作的可视化面部表情检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的八类面部表情&#xff1a…

3D开发工具HOOPS在BIM系统中的应用

建筑信息模型是一种革命性的建筑设计、施工和管理方法。它通过创建和利用数字信息来优化建筑项目的设计、施工和运营过程。在这个过程中&#xff0c;3D开发工具HOOPS扮演着至关重要的角色&#xff0c;为BIM系统提供了强大的技术支持和丰富的功能。HOOPS中文网http://techsoft3d…

ThreadLocal简介

Thread类中&#xff0c;有个ThreadLocal.ThreadLocalMap 的成员变量。 ThreadLocalMap内部维护了Entry数组&#xff0c;每个Entry代表一个完整的对象&#xff0c;key是ThreadLocal本身&#xff0c;value是ThreadLocal的泛型对象值 public void set(T value) {Thread t Thread…

前端开发之xlsx的使用和实例,并导出多个sheet

前端开发之xlsx的使用和实例 前言效果图1、安装2、在页面中引用3、封装工具类&#xff08;excel.js&#xff09;4、在vue中使用 前言 在实现业务功能中导出是必不可少的功能&#xff0c;接下来为大家演示在导出xlsx的时候的操作 效果图 1、安装 npm install xlsx -S npm inst…

Android HAL到Framework

一、为什么需要Framwork? Framework实际上是⼀个应⽤程序的框架&#xff0c;提供了很多服务&#xff1a; 1、丰富⽽⼜可扩展的视图&#xff08;Views&#xff09;&#xff0c; 可以⽤来构建应⽤程序&#xff0c;它包括列表&#xff08;lists&#xff09;&#xff0c;⽹格&am…

代码随想录算法训练营第20天 |● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

文章目录 前言654.最大二叉树思路方法一 递归法方法一2 老师的优化递归法 617.合并二叉树思路方法一 递归法方法二 迭代法 700.二叉搜索树中的搜索思路方法一 递归法方法二 迭代法 98.验证二叉搜索树思路方法一 使用数组方法二 不使用数组代码注意点&#xff1a; 方法二 使用双…

SecureCRT for Mac注册激活版:专业终端SSH工具

SecureCRT是一款支持SSH&#xff08;SSH1和SSH2&#xff09;的终端仿真程序&#xff0c;简单地说是Windows下登录UNIX或Linux服务器主机的软件。 SecureCRT支持SSH&#xff0c;同时支持Telnet和rlogin协议。SecureCRT是一款用于连接运行包括Windows、UNIX和VMS的理想工具。通过…

零售EDI:Target DVS EDI项目案例

Target塔吉特是美国一家巨型折扣零售百货集团&#xff0c;与全球供应商建立长远深入的合作关系&#xff0c;目前国内越来越多的零售产品供应商计划入驻Target。完成入驻资格审查之后&#xff0c;Target会向供应商提出EDI对接邀请&#xff0c;企业需要根据指示完成供应商EDI信息…

Vue学习笔记3——事件处理

事件处理 1、事件处理器&#xff08;1&#xff09;内联事件处理器&#xff08;2&#xff09;方法事件处理器 2、事件参数3、事件修饰符 1、事件处理器 我们可以使用v-on 指令(简写为)来监听DOM事件&#xff0c;并在事件触发时执行对应的JavaScript。 用法: v-on:click"me…

[自动驾驶技术]-6 Tesla自动驾驶方案之硬件(AI Day 2021)

1 硬件集成 特斯拉自动驾驶数据标注过程中&#xff0c;跨250万个clips超过100亿的标注数据&#xff0c;无论是自动标注还是模型训练都要求具备强大的计算能力的硬件。下图是特斯拉FSD计算平台硬件电路图。 1&#xff09;神经网络编译器 特斯拉AI编译器主要针对PyTorch框架&am…

【面试必看】Java并发

并发 1. 线程 1. 线程vs进程 进程是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态的。 系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。在 Java 中&#xff0c;当我们启动 main 函数时其实就是启动了一个 JVM 的进…

java文档管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 文档管理系统的…

初学C语言100题:经典例题节选(源码分享)

1.打印Hello World! #include <stdio.h>int main() {printf("hello world\n");//使用printf库函数 注意引用头文件return 0; } 2.输入半径 计算圆的面积 int main() {float r, s;//定义变量scanf("%f", &r);//输入半径s 3.14 * r * r;// 圆的…

Android network — 进程指定网络发包

Android network — 进程指定网络发包 0. 前言1. 进程绑定网络1.1 App进程绑定网络1.2 Native进程绑定网络 2. 源码原理分析2.1 申请网络requestNetwork2.2 绑定网络 BindProcessToNetwork 3. 总结 0. 前言 在android 中&#xff0c;一个app使用网络&#xff0c;需要在manifest…