数组基础-笔记

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

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

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

举一个字符数组的例子:

注意两点:

数组下标从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.mzph.cn/news/843007.shtml

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

相关文章

Python的selenium爬取

1.selenium 1.1.前言 使用python的requests模块还是存在很大的局限性&#xff0c;例如&#xff1a;只发一次请求&#xff1b;针对ajax动态加载的网页则无法获取数据等等问题。特此&#xff0c;本章节将通过selenium模拟浏览器来完成更高级的爬虫抓取任务。 1.2.什么是seleniu…

Redhat7.4部署MySQL-5.7.17搭建双主互为主从

一、准备工作 需要先准备已经搭建好的两台数据库&#xff0c;并且保证服务器之间网络是通的&#xff0c;3306端口可以相互访问。 二、修改两台数据库my.cnf 配置文件&#xff0c;将下列内容添加进去&#xff0c;放在 [mysqld] 下 我们暂定两台服务器为A服务和B服务&#xff…

【音视频基础概念】颜色与图像

文章目录 前言一、三原色不同三原色的概念三原色的作用 二、颜色空间颜色空间是什么颜色空间的作用常见颜色空间示例灰度图像是什么灰度图像的作用灰度图像的技术细节示例 总结 前言 在当今数字媒体时代&#xff0c;音视频技术在我们的日常生活中占据了重要位置。无论是观看电…

线代与图形学的暧昧二三事

A Swift and Brutal Introduction to Linear Algebra 计算机图形学依赖于线性代数、微积分、统计...物理方面涉及到光学&#xff08;波动光学&#xff1a;不再假设光是直线传播&#xff0c;作为一种光波与物体表面材质进行作用接触&#xff0c;如何生成不同的外观&#xff09;…

STM32硬件接口I2C应用(基于BH1750)

目录 概述 1 STM32Cube控制配置I2C 1.1 I2C参数配置 1.2 使用STM32Cube产生工程 2 HAL库函数介绍 2.1 初始化函数 2.2 写数据函数 2.3 读数据函数 3 光照传感器BH1750 3.1 认识BH1750 3.2 BH1750寄存器 3.3 采集数据流程 4 BH1750驱动实现 4.1 接口函数实现 4.2…

vite+js配置

vite js 配置路径 npm install types/node --save-dev vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue //需要引入 import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {a…

港口与航运3D三维虚拟仿真展区让更多人了解到海洋知识

在短短20天内&#xff0c;搭建起200多家线上3D展厅&#xff0c;听起来似乎是一项艰巨的任务。然而&#xff0c;对于我们的3d云展平台而言&#xff0c;这早已成为常态。连续三年&#xff0c;我们已成功为众多会展公司在短时间内构建出几百家甚至上千家的线上3D展会&#xff0c;见…

简单的利用有限脉冲响应(FIR)滤波器对心电信号进行降噪(Python)

代码很简单。 import numpy as np import matplotlib.pyplot as plt#------------------------Bandstop Filter Function------------------------ def bandstop(M,low,high,Fs):#50Hz removalk1 int( (low/Fs)*M) # index 22k2 int( (high/Fs)*M) # index 27#DC removalk0 …

关于C++的IO流简单总结

基础IO流 C的IO以面向对象的形式实现, 同时兼容了C语言面向过程的IO方式 C 标准库提供了四个基本流对象&#xff1a; cin&#xff1a;用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。 cout&#xff1a;用于向标准输出&#xff08;通常是控制台&#xff09;写入…

怎么使用Stable diffusion中的models

Stable diffusion中的models Stable diffusion model也可以叫做checkpoint model&#xff0c;是预先训练好的Stable diffusion权重&#xff0c;用于生成特定风格的图像。模型生成的图像类型取决于训练图像。 如果训练数据中从未出现过猫的图像&#xff0c;模型就无法生成猫的…

面试八-存泄漏是什么,有哪几种,怎么解决?

一、内存泄漏几种情况 当使用基类指针指向派生类对象时&#xff0c;如果基类的析构函数不是虚函数&#xff0c;那么在使用基类指针来删除这个对象时&#xff0c;只会调用基类的析构函数&#xff0c;而不会调用派生类的析构函数。这就导致了派生类中的资源无法正确释放&#xff…

22公司斩获亚洲品牌经济峰会“亚洲数字化服务领军企业奖”

5月25日&#xff0c;以“亚洲新势力&#xff1a;创新、融合与可持续发展”为主题的亚洲品牌经济峰会2024深圳会议在深圳益田威斯汀酒店举办&#xff0c;本次活动由中国亚洲经济发展协会指导&#xff0c;由亚洲国际品牌研究院主办&#xff0c;旨在搭建品牌创新与经济发展交流平台…

B站pink老师CSS学习(一)

文章目录 一、CSS基础选择器1.标签选择器2.类选择器3. id选择器4.通配符选择器 二、字体属性1.字体2.字体大小3.字体粗细4.文字样式5.复合属性 三、文本属性1.文本颜色2.对齐文本3.装饰文本4.文本缩进5.行间距 四、CSS引入方式1. 内部样式表2.行内样式表3.外部样式表 一、CSS基…

CTF流量分析之wireshark使用

01.基本介绍 在CTF比赛中&#xff0c;对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供一个包含流量数据的pcap文件&#xff0c;参赛选手通过该文件筛选和过滤其中无关的流量信息&#xff0c;根据关键流量信息找出flag或者相关线索。 pcap流量包的分析通常…

响应式页面布局处理-一篇打尽

纯pc端响应式 pc端平常用到的响应式布局 大致就如下三种&#xff0c;当然也会有其他方法&#xff0c;欢迎评论区补充 将div height、width设置成100% flex布局 flex布局主要是将flex-wrap: wrap&#xff0c; 最后&#xff0c;你可以通过给子元素设置 flex 属性来控制它们的…

布隆过滤器-详解及使用

一、什么是布隆过滤器 1、简介 布隆过滤器是一个很长的二进制向量和一系列随机映射函数。可以用于检索一个元素是否在一个集合中。。理解为SET集合。 布隆过滤器其内部维护了一个全为 0 的 bit 数组&#xff0c;需要说明的是&#xff0c;布隆过滤器有一个误判的概念&#xf…

如何搭建雾锁王国多人联机服务器,搭建教程分享

雾锁王国&#xff08;Enshrouded&#xff09;是一款融合了生存、制作以及动作RPG战斗的游戏&#xff0c;2024年1月24日在Steam平台以抢先体验形式发售&#xff0c;支持中文。游戏背景设定在一个基于体素构筑的辽阔大陆上。玩家将在这个开放世界中自由选择前进的方向&#xff0c…

机器视觉HALCON:3.图像获取,运算,率噪,滤波(边缘),锐化

目录 图像获取生成单通道图像图像运算加法运算减法运算乘法运算除法 仿射变换图像平滑&#xff08;噪点处理&#xff09;高斯滤波均值滤波中值滤波多图像均值 边缘滤波索贝尔滤波凯尼滤波 图像锐化索贝尔锐化拉普拉斯锐化高通滤波锐化几种锐化方式对比 图像获取 用到的函数&…

8个最佳实践,助你打造成功的短剧平台开发团队

当涉及到跨境电商平台开发&#xff0c;成功的团队至关重要。在这篇文章中&#xff0c;我将分享8个最佳实践&#xff0c;助你打造成功的短剧平台开发团队。无论是经验丰富的团队还是初创企业&#xff0c;这些实践都能为你的团队带来价值&#xff0c;提高开发效率&#xff0c;确保…

lua 计算第几周

需求 计算当前赛季的开始和结束日期&#xff0c;2024年1月1日周一是第1周的开始&#xff0c;每两周是一个赛季。 lua代码 没有处理时区问题 local const 24 * 60 * 60 --一整天的时间戳 local server_time 1716595200--todo:修改服务器时间 local date os.date("*t…