Leetcode-算法题模板总结

本文介绍了ACM竞赛中常见的算法技巧,如递推在动态规划中的应用,大数越界问题的解决方案,空间复杂度优化,以及回溯法、链表操作、滑动窗口和指针模式在不同问题中的模板。还讨论了二叉树遍历及其在算法设计中的角色。
摘要由CSDN通过智能技术生成

Tricks:
1、涉及求“多少种可能性”的题目一般都有递推性质
比如青蛙跳台阶
2、注意大数越界问题:随着n的增大,f(n)会超过int32甚至int64的取值范围,此时可以用“求余运算规则”。
3、注意python初始化一个空数组:dp = [0] * (n + 1) 这里是(n+1),不是n
4、空间复杂度优化:比如当dp列表的第i项只与第i-1和第i-2项有关,因此只需初始化三个整形变量 sum a b ,利用辅助变量sum使a b两数字交替前进即可。节省列表空间

ACM格式输入输出参考:
https://huaweicloud.csdn.net/63806984dacf622b8df87226.html

5、回溯法:实质是对隐式图的深度优先搜索算法
5.1模型:DFS BFS
5.2 python模板:判断+单层搜索;主函数:遍历起始点
详见:

6、链表 分为单链表 双链表和环形链表:
6.1、链表是以节点的方式存储,节点的逻辑顺序和物理顺序可以不一致
---------单链表插入节点(先后在前):X为新节点,先将其next指向为A2,再将A1上午next指向为X即可
在这里插入图片描述
删除节点:将A1的next指向为A3,这样便删除A2
-------双链表:pre data next
插入节点(正序):需要通过调整两次pre指向和两次next指向来完成。如下图,将A1的next指向X,将X的next指向A2,再将A2的pre指向X,将X的pre指向A1
在这里插入图片描述
删除双链表节点:需要通过调整一次pre指向和一次next指向来完成,如下图:将A1的next指向A3,再将A3的pre指向A1即可。

------例题之python模板:

class Node:
	def __init__(self,value):
	self.value=value
	self.prev=None
	self.next=None
def solve():#解题
	head=Node(value)#节点
	curr=head
	#创建一个从1-n排列的链表
	for i in range(2,n+1):
		node=Node(i)
		curr.next=node
		node.prev=curr
		curr=node
	#curr 规范地放在头尾
	curr.next=head
	head.prev=curr

------环形链表(循环链表)之单向环形
环形链表只需要保证链表的最后一个节点指向链表的第一个节点head 即可:third.next = head
在这里插入图片描述
例如:约瑟夫问题:https://blog.csdn.net/qq_44625774/article/details/105518197

7、滑动窗口模板
以右指针(end)作为驱动,拖着左指针(start)向前走。右指针每次只移动一步,而左指针在内部 while 循环中每次可能移动多步。

def solve(s):
	x,y=
	#首尾端
	start=0
	for end in range((len(s)):
	#更新需要维护的变量 有的变量需要if判断(如最大最小长度)
		x=new_x
		if condition:
			y=new_y
————————			
		#下面 分两种情况处理
		#情况一:窗口长度固定 如果达到 左指针前移一个单位
		if 达到限定长度:
			更新部分或所有维护变量
			窗口左指针前移一个单位
--------------
		#情况二:长度可变 涉及窗口是否合法
		while 不合法:
			更新部分或所有维护变量
			不断移动左指针直到窗口再次合法
	return	

8、一二指针模式
包括:对撞指针、快慢指针、分离双指针
比如:
求一个排序数组的平方(简单)
求总和为零的三元组(中等)
比较包含回退(backspace)的字符串(中等)
例题框架 盛最多水的容器

def solve(height):
	result=0
	left=0
	right=len(height)-1
	while left<right:
	#题目要求 规则
		l=right-left
		h=min(height[left], height[right])
		area=l*h
		result=max(result,area)
		#根据要求 移动两指针
		if height[left]<height[right]:
			left+=1
		else:
			right-=1
	return result
		

9、二叉树:遍历方式有BFS 和DFS(深度遍历又主要包含先序 中序后序遍历)
(1)二叉树算法设计总路线:把当前节点要做的事做好,其他的扔给递归,无需当前节点操心;

(2)如果当前节点会对下面的子节点有整体影响,可以通过辅助函数增长参数列表,借助参数传递信息;
BFS:主要解决最短路径问题,且二维数组一般会转化为一维数组处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 二分法 5 1.1. 什么是二分查找 5 1.2. 如何识别二分法 5 1.3. 二分法模板 6 1.3.1. 模板一 6 1.3.1.1. 模板代码 6 1.3.1.2. 关键属性 7 1.3.1.3. 语法说明 7 1.3.1.4. Lc69:x的平方根 8 1.3.1.5. Lc374:猜数大小 9 1.3.1.6. Lc33:搜索旋转数组 11 1.3.2. 模板二 13 1.3.2.1. 模板代码 13 1.3.2.2. 关键属性 14 1.3.2.3. 语法说明 14 1.3.2.4. Lc278:第一个错误版本 14 1.3.2.5. Lc162:寻找峰值 16 1.3.2.6. Lc153:寻找旋转排序数组最小值 19 1.3.2.7. Lc154:寻找旋转排序数组最小值II 20 1.3.3. 模板三 22 1.3.3.1. 模板代码 22 1.3.3.2. 关键属性 23 1.3.3.3. 语法说明 23 1.3.3.4. LC-34:在排序数组中查找元素的第一个和最后一个 23 1.3.3.5. LC-658:找到K个最接近的元素 25 1.3.4. 小结 28 1.4. LeetCode中二分查找目 29 2. 双指针 30 2.1. 快慢指针 31 2.1.1. 什么是快慢指针 31 2.1.2. 快慢指针模板 31 2.1.3. 快慢指针相关目 32 2.1.3.1. LC-141:链表是否有环 32 2.1.3.2. LC-142:环形链表入口 34 2.1.3.3. LC-876:链表的中间节点 37 2.1.3.4. LC-287:寻找重复数 40 2.2. 滑动窗口 43 2.2.1. 什么是滑动窗口 43 2.1.4. 常见型 44 2.1.5. 注意事项 45 2.1.6. 滑动窗口模板 45 2.1.7. 滑动窗口相关目 46 2.1.7.1. LC-3:无重复字符的最长子串 47 2.1.7.2. LC-76:最小覆盖子串 49 2.1.7.3. LC-209:长度最小的子数组 54 2.1.7.4. LC-239:滑动窗口最大值 57 2.1.7.5. LC-395:至少有K个重复字符的最长子串 60 2.1.7.6. LC-567:字符串排列 62 2.1.7.7. LC-904:水果成篮 64 2.1.7.8. LC-424:替换后的最长重复字符 66 2.1.7.9. LC-713:乘积小于K的子数组 67 2.1.7.10. LC-992:K个不同整数的子数组 70 2.3. 左右指针 73 2.3.1. 模板 73 2.3.2. 相关目 73 2.3.2.1. LC-76:删除倒数第N个节点 74 2.3.2.2. LC-61:旋转链表 76 2.3.2.3. LC-80:删除有序数组中的重复项 79 2.3.2.4. LC-86:分割链表 80 2.3.2.5. LC-438:找到字符串中所有字母的异位词 82 3. 模板 85 2.3.2.6. LC-76:删除倒数第N个节点 85
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值