当前位置: 首页 > news >正文

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码

LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中)-CSDN博客

算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn)

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

时间复杂度和空间复杂度

时间复杂度

空间复杂度

Day1

数组

遍历、查找、排序、双指针。

53. 最大子数组和 - 力扣(LeetCode)

Kadane算法,动态规划

【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)_kadane算法-CSDN博客

from typing import Listclass Solution:def maxSubArray(self, nums: List[int]) -> int:if not nums:  # 处理空数组return 0max_sum = current_sum = nums[0]  # 初始化为第一个元素for num in nums[1:]:# 决定是否扩展子数组或重新开始current_sum = max(num, current_sum + num)# 更新全局最大值max_sum = max(max_sum, current_sum)return max_sum
a=Solution()
a. maxSubArray(nums = [-2,1,-3,4,-1,2,1,-5,4])

56. 合并区间 - 力扣(LeetCode)

贪心算法

1.区间排序

2.修改边界值:如果当前区间的左边界大于结果中的最后一个右边界则添加元素到结果中,如果小于等于则更新结果中的右边界。

class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:if len(intervals) == 0: return intervalsintervals.sort(key=lambda x: x[0])result = []for i,num in enumerate(intervals):if len(result)==0 or num[0]>result[-1][1]:result.append(num)else:result[-1][1]=max(result[-1][1],num[1])return result

相似题目:

435. 无重叠区间 - 力扣(LeetCode)

根据区间右边界升序排列;
维护right,代表已留下区间的最大右边界;
遍历排序后的区间:
如果当前区间的左边界 ≥ right,该区间可以留下,更新right
如果当前区间的左边界 < right,该区间去除,更新结果res

class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if not intervals:return 0intervals.sort(key = lambda x : x[1])res = 0right = intervals[0][1]for i in range(1, len(intervals)):if intervals[i][0] < right:res += 1else:right = intervals[i][1]return resa=Solution()
a.  eraseOverlapIntervals(intervals =[[1,2],[2,3],[3,4],[1,3]])

189. 轮转数组 - 力扣(LeetCode)

class Solution:def rotate(self, nums: List[int], k: int) -> None:# 定义反转函数:原地反转 nums[i..j]def reverse(i: int, j: int) -> None:while i < j:nums[i], nums[j] = nums[j], nums[i]  # 交换头尾元素i += 1j -= 1n = len(nums)k %= n  # 处理 k >= n 的情况(如 k=10, n=7 → k=3)reverse(0, n - 1)  # 整体反转reverse(0, k - 1)  # 反转前 k 个元素reverse(k, n - 1)  # 反转剩余元素

切片

class Solution:def rotate(self, nums: List[int], k: int) -> None:k %= len(nums)  nums[:] = nums[-k:] + nums[:-k]

相似题目:

151. 反转字符串中的单词 - 力扣(LeetCode)

class Solution:def reverseWords(self, s: str) -> str:return " ".join(reversed(s.split()))

 238. 除自身以外数组的乘积 - 力扣(LeetCode)

这个属于动态规划中的前后缀分解问题

class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:n = len(nums)pre = [1] * nfor i in range(1, n):pre[i] = pre[i - 1] * nums[i - 1]suf = [1] * nfor i in range(n - 2, -1, -1):suf[i] = suf[i + 1] * nums[i + 1]return [p * s for p, s in zip(pre, suf)]

​ 

41. 缺失的第一个正数 - 力扣(LeetCode)

哈希表方法:将所有正数存储在哈希表中,从 1 开始递增寻找不在哈希表中的最小正数。

def firstMissingPositive(nums):num_set = set(nums)target = 1while target in num_set:target += 1return target
# 示例调用
print(firstMissingPositive([1, 2, 0]))  # 输出: 3
print(firstMissingPositive([3, 4, -1, 1]))  # 输出: 2
print(firstMissingPositive([7, 8, 9, 11, 12]))  # 输出: 1
  • 时间复杂度:O(N),虽然使用了哈希表,但构建哈希表和查询的总时间仍是线性的。
  • 空间复杂度:O(N),需要额外的空间来存储哈希表。

排序后线性扫描

def firstMissingPositive(nums):nums.sort()target = 1for num in nums:if num == target:target += 1return target
# 示例调用
print(firstMissingPositive([1, 2, 0]))  # 输出: 3
print(firstMissingPositive([3, 4, -1, 1]))  # 输出: 2
print(firstMissingPositive([7, 8, 9, 11, 12]))  # 输出: 1
  • 时间复杂度:O(N log N),主要时间开销来源于排序(排序算法的复杂度为N log N)。
  • 空间复杂度:O(1) 或 O(N),这取决于使用的排序算法。

 利用数组索引作为哈希表

原地哈希技巧用于标记某个数字是否存在于数组中。这种方法的目的是在不使用额外空间的情况下,记录数字的存在情况。

1.将所有非正整数(负数和零)替换为一个不可能出现在结果中的数字(n + 1)

2.遍历数组,将每个数字对应的索引位置的值置为负数,表示该数字存在。

3.遍历数组,找到第一个值为正数的索引位置,该索引加 1 就是缺失的最小正整数。

def firstMissingPositive(nums):n = len(nums)# 将所有的负数和零替换为n+1,n+1是一个不可能出现在合法输出中的数字for i in range(n):if nums[i] <= 0:nums[i] = n + 1# 使用数组索引作为哈希键,通过置负标记存在的数字for i in range(n):num = abs(nums[i])if num <= n:nums[num - 1] = -abs(nums[num - 1])# 寻找第一个大于0的索引位置,即是缺失的最小正数for i in range(n):if nums[i]> 0:return i + 1# 如果数组中包含了1到n的所有数字,则缺失的第一个正数是n+1return n + 1
# 示例调用
print(firstMissingPositive([1, 2, 0]))  # 输出: 3
print(firstMissingPositive([3, 4, -1, 1]))  # 输出: 2
print(firstMissingPositive([7, 8, 9, 11, 12]))  # 输出: 1

矩阵

73. 矩阵置零 - 力扣(LeetCode)

空间复杂度为 O(m+n) 的解法

在这种解法中,我们使用两个集合(或列表)来分别记录需要置零的行和列。

def setZeroes(matrix):if not matrix or not matrix[0]:returnm, n = len(matrix), len(matrix[0])zero_row = set()zero_col = set()# 遍历矩阵,记录需要置零的行和列for i in range(m):for j in range(n):if matrix[i][j] == 0:zero_row.add(i)zero_col.add(j)# 将需要置零的行和列的元素设为0for i in zero_row:for j in range(n):matrix[i][j] = 0for j in zero_col:for i in range(m):matrix[i][j] = 0# 示例
matrix = [[1, 1, 1],[1, 0, 1],[1, 1, 1]
]
setZeroes(matrix)
print(matrix)  # 输出: [[1, 0, 1], [0, 0, 0], [1, 0, 1]]

空间复杂度为 O(1) 的解法

算法的空间复杂度是 O(1),因为我们是在原地修改矩阵,没有使用额外的空间

在这种解法中,我们利用矩阵的第一行和第一列来记录其余行和列是否需要置零。但是,我们需要先检查第一行和第一列本身是否包含0。

def setZeroes(matrix):if not matrix or not matrix[0]:returnm, n = len(matrix), len(matrix[0])first_row_zero = any(matrix[0][j] == 0 for j in range(n))first_col_zero = any(matrix[i][0] == 0 for i in range(m))# 使用第一行和第一列作为标记for i in range(1, m):for j in range(1, n):if matrix[i][j] == 0:matrix[i][0] = 0matrix[0][j] = 0# 根据第一行和第一列的标记来置零for i in range(1, m):if matrix[i][0] == 0:for j in range(1, n):matrix[i][j] = 0for j in range(1, n):if matrix[0][j] == 0:for i in range(1, m):matrix[i][j] = 0# 如果第一行原本有0,则将第一行置零if first_row_zero:for j in range(n):matrix[0][j] = 0# 如果第一列原本有0,则将第一列置零if first_col_zero:for i in range(m):matrix[i][0] = 0# 示例
matrix = [[1, 1, 1],[1, 0, 1],[1, 1, 1]
]
setZeroes(matrix)
print(matrix)  # 输出: [[1, 0, 1], [0, 0, 0], [1, 0, 1]]

48. 旋转图像 - 力扣(LeetCode)

矩阵顺时针旋转相当于先沿着对角线交换元素,然后反转每一行

class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""n = len(matrix)for i in range(n):# 注意这里j的范围 如果j的范围也是0到n-1那么会出现交换后又交换回来 等于没有交换for j in range(i):matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]for line in matrix:line.reverse()

逆时针旋转90度

class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""n = len(matrix)# 既然副对角线为主那么i的范围就是从n-1到0啦 因为python的range是左闭右开所以是n-1和-1for i in range(n-1,-1):# 注意这里j的范围 如果j的范围也是0到n-1那么会出现交换后又交换回来 等于没有交换for j in range(i):matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]for line in matrix:line.reverse()

54. 螺旋矩阵 - 力扣(LeetCode)

class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""result = []while matrix:# 取出矩阵的第一行result += matrix.pop(0)# 旋转矩阵使其再次符合顺时针顺序#zip(*matrix)会将矩阵的行转换为列,
#并返回一个迭代器,而list()将其转换为列表,[::-1]将列表中的元素逆序,从而实现逆时针旋转90度。if matrix:matrix = list(zip(*matrix))[::-1]return result

 

 240. 搜索二维矩阵 II - 力扣(LeetCode)

二分查找

class Solution:def searchMatrix(self, matrix, target):if not matrix or not matrix[0]:return Falserows, cols = len(matrix), len(matrix[0])x, y = rows - 1, 0  # 从左下角开始while x >= 0 and y < cols:if matrix[x][y] == target:return Trueelif matrix[x][y] < target:y += 1  # 向右移动else:x -= 1  # 向上移动return False# 示例使用
sol = Solution()
matrix = [[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]
]
target = 5
print(sol.searchMatrix(matrix, target))  # 输出: True

字符串

字符串拼接、切片、查找、替换。

344. 反转字符串 - 力扣(LeetCode)

(版本一) 双指针

class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""left, right = 0, len(s) - 1# 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(len(s)//2)更低# 因为while每次循环需要进行条件判断,而range函数不需要,直接生成数字,因此时间复杂度更低。推荐使用rangewhile left < right:s[left], s[right] = s[right], s[left]left += 1right -= 1

相关文章:

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…...

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.项集&#xff08;Itemset&#xff09; 2.规则&#xff08;Rule&#xff09; 3.支持度&#xff08;Support&#xff09; 3.1 支持度的定义 3.2 支持度的意义 3.3 支持度的应用 3.4 支持度的示例 3.5 支持度的调整 3.6 支持度与其他指标的关系 4.置信度&#xff0…...

1/30每日一题

从输入 URL 到页面展示到底发生了什么&#xff1f; 1. 输入 URL 与浏览器解析 当你在浏览器地址栏输入 URL 并按下回车&#xff0c;浏览器首先会解析这个 URL&#xff08;统一资源定位符&#xff09;&#xff0c;比如 https://www.example.com。浏览器会解析这个 URL 中的不同…...

vim的多文件操作

[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明&#xff1a;快捷键ctrlshift^&#xff0c…...

设计转换Apache Hive的HQL语句为Snowflake SQL语句的Python程序方法

首先&#xff0c;根据以下各类HQL语句的基本实例和官方文档记录的这些命令语句各种参数设置&#xff0c;得到各种HQL语句的完整实例&#xff0c;然后在Snowflake的官方文档找到它们对应的Snowflake SQL语句&#xff0c;建立起对应的关系表。在这个过程中要注意HQL语句和Snowfla…...

CAPL与外部接口

CAPL与外部接口 目录 CAPL与外部接口1. 引言2. CAPL与C/C++交互2.1 CAPL与C/C++交互简介2.2 CAPL与C/C++交互实现3. CAPL与Python交互3.1 CAPL与Python交互简介3.2 CAPL与Python交互实现4. CAPL与MATLAB交互4.1 CAPL与MATLAB交互简介4.2 CAPL与MATLAB交互实现5. 案例说明5.1 案…...

无公网IP 外网访问 本地部署夫人 hello-algo

hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式&#xff0c;为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo&#xff0c;并结合路由侠内网穿透实现外网访问本地部署…...

实验四 XML

实验四 XML 目的&#xff1a; 1、安装和使用XML的开发环境 2、认识XML的不同类型 3、掌握XML文档的基本语法 4、了解DTD的作用 5、掌握DTD的语法 6、掌握Schema的语法 实验过程&#xff1a; 1、安装XML的编辑器&#xff0c;可以选择以下之一 a)XMLSpy b)VScode&#xff0c;Vs…...

Autosar-Os是怎么运行的?(内存保护)

写在前面&#xff1a; 入行一段时间了&#xff0c;基于个人理解整理一些东西&#xff0c;如有错误&#xff0c;欢迎各位大佬评论区指正&#xff01;&#xff01;&#xff01; 1.功能概述 以TC397芯片为例&#xff0c;英飞凌芯片集成了MPU模块&#xff0c; MPU模块采用了硬件机…...

题单:冒泡排序1

题目描述 给定 n 个元素的数组&#xff08;下标从 1 开始计&#xff09;&#xff0c;请使用冒泡排序对其进行排序&#xff08;升序&#xff09;。 请输出每一次冒泡过程后数组的状态。 要求&#xff1a;每次从第一个元素开始&#xff0c;将最大的元素冒泡至最后。 输入格式…...

多目标优化策略之一:非支配排序

多目标优化策略中的非支配排序是一种关键的技术,它主要用于解决多目标优化问题中解的选择和排序问题,确定解集中的非支配解(也称为Pareto解)。 关于什么是多目标优化问题,可以查看我的文章:改进候鸟优化算法之五:基于多目标优化的候鸟优化算法(MBO-MO)-CSDN博客 多目…...

Go学习:字符、字符串需注意的点

Go语言与C/C语言编程有很多相似之处&#xff0c;但是Go语言中在声明一个字符时&#xff0c;数据类型与其他语言声明一个字符数据时有一点不同之处。通常&#xff0c;字符的数据类型为 char&#xff0c;例如 &#xff1a;声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…...

Linux文件原生操作

Linux 中一切皆文件&#xff0c;那么 Linux 文件是什么&#xff1f; 在 Linux 中的文件 可以是&#xff1a;传统意义上的有序数据集合&#xff0c;即&#xff1a;文件系统中的物理文件 也可以是&#xff1a;设备&#xff0c;管道&#xff0c;内存。。。(Linux 管理的一切对象…...

解决Oracle SQL语句性能问题(10.5)——常用Hint及语法(7)(其他Hint)

10.5.3. 常用hint 10.5.3.7. 其他Hint 1)cardinality:显式的指示优化器为SQL语句的某个行源指定势。该Hint具体语法如下所示。 SQL> select /*+ cardinality([@qb] [table] card ) */ ...; --注: 1)这里,第一个参数(@qb)为可选参数,指定查询语句块名;第二个参数…...

JavaScript系列(50)--编译器实现详解

JavaScript编译器实现详解 &#x1f528; 今天&#xff0c;让我们深入探讨JavaScript编译器的实现。编译器是一个将源代码转换为目标代码的复杂系统&#xff0c;通过理解其工作原理&#xff0c;我们可以更好地理解JavaScript的执行过程。 编译器基础概念 &#x1f31f; &…...

大数据相关职位 职业进阶路径

大数据相关职位 & 职业进阶路径 &#x1f4cc; 大数据相关职位 & 职业进阶路径 大数据领域涵盖多个方向&#xff0c;包括数据工程、数据分析、数据治理、数据科学等&#xff0c;每个方向的进阶路径有所不同。以下是大数据相关职位的详细解析及其职业进阶关系。 &#…...

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…...

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分&#xff1a;STL 概述第二部分&#xff1a;STL 容器第三部分&#xff1a;STL 迭代器第四部分&#xff1a;STL 算法第五部分&#xff1a;STL 函数对象第六部分&#xff1a;STL 高级主题第七部分&#xff1a;STL 实战应用 三、写作风格四、…...

【Rust自学】15.3. Deref trait Pt.2:隐式解引用转化与可变性

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.3.1. 函数和方法的隐式解引用转化(Deref Coercion) 隐式解引用转化(Deref Coercion)是为函数和方法提供的一种便捷特性。 它的原理是…...

密码强度验证代码解析:C语言实现与细节剖析

在日常的应用开发中&#xff0c;密码强度验证是保障用户账户安全的重要环节。今天&#xff0c;我们就来深入分析一段用C语言编写的密码强度验证代码&#xff0c;看看它是如何实现对密码强度的多维度检测的。 代码整体结构 这段C语言代码主要实现了对输入密码的一系列规则验证&a…...

arkts bridge使用示例

接上一篇&#xff1a;arkui-x跨平台与android java联合开发-CSDN博客 本篇讲前端arkui如何与后端其他平台进行数据交互&#xff0c;接上一篇&#xff0c;后端os平台为Android java。 arkui-x框架提供了一个独特的机制&#xff1a;bridge。 1、前端接口定义实现 定义一个bri…...

LINUX部署微服务项目步骤

项目简介技术栈 主体技术&#xff1a;SpringCloud&#xff0c;SpringBoot&#xff0c;VUE2&#xff0c; 中间件&#xff1a;RabbitMQ、Redis 创建用户 在linux服务器home下创建用户qshh&#xff0c;用于后续本项目需要的环境进行安装配置 #创建用户 useradd 用户名 #设置登录密…...

zsh安装插件

0 zsh不仅在外观上比较美观&#xff0c;而且其具有强大的插件&#xff0c;如果不使用那就亏大了。 官方插件库 https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins 官方插件库并不一定有所有的插件&#xff0c;比如zsh-autosuggestions插件就不再列表里&#xff0c;下面演示zs…...

网站如何正式上线(运维详解)

因为平台原因&#xff0c;不能有太多链接&#xff0c;所以下文中链接都删除了&#xff0c;想访问的去原文链接&#xff1a;https://www.zhoudongqi.com/ TIPS 这篇文章是我自己运营运维的wordpess站点的经验总结&#xff0c;可以说十分详细&#xff0c;域名&#xff0c;服务器和…...

SQL server 数据库使用整理

标题&#xff1a;SQL server 数据库使用整理 1.字符串表名多次查询 2.读取SQL中Json字段中的值&#xff1a;JSON_VALUE&#xff08;最新版本支持&#xff0c;属性名大小写敏感&#xff09; 1.字符串表名多次查询 SELECT ROW_NUMBER() OVER (ORDER BY value ASC) rowid,value…...

【Rust自学】17.2. 使用trait对象来存储不同值的类型

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 17.2.1. 需求 这篇文章以一个例子来介绍如何在Rust中使用trait对象来存储不同值的类型。 …...

初始化mysql报错cannot open shared object file: No such file or directory

报错展示 我在初始化msyql的时候报错&#xff1a;mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 解读&#xff1a; libaio包的作用是为了支持同步I/O。对于数据库之类的系统特别重要&#xff0c;因此…...

2025年1月22日(网络编程)

系统信息&#xff1a; ubuntu 16.04LTS Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习…...

Jason配置环境变量

jason官网 https://jason-lang.github.io/ https://github.com/jason-lang/jason/releases 步骤 安装 Java 21 或更高版本 安装 Visual Studio Code 根据操作系统&#xff0c;请按照以下具体步骤操作 视窗 下载 Jason 的最新版本&#xff0c;选择“jason-bin-3.3.0.zip”…...

蓝桥杯python语言基础(7)——自定义排序和二分查找

目录 一、自定义排序 &#xff08;一&#xff09;sorted &#xff08;二&#xff09;list.sort 二、二分查找 bisect 一、自定义排序 &#xff08;一&#xff09;sorted sorted() 函数会返回一个新的已排序列表&#xff0c;而列表的 sort() 方法会直接在原列表上进行排序…...