当前位置: 首页 > 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…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...