Day 37 | 01背包问题 、416. 分割等和子集
1.Day2| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II2.Day 1 | 704. 二分查找、27. 移除元素3.Day3 | 203.移除链表元素 、707.设计链表 、 206.反转链表4.Day 4 | 24. 两两交换链表中的节点 、 19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交 、142.环形链表II5.Day 6| 242.有效的字母异位词 、349. 两个数组的交集 、 202. 快乐数 、 1. 两数之和6.Day 7| 454.四数相加II 、383. 赎金信 、15. 三数之和 、18. 四数之和7.Day 8 | 344.反转字符串 、541. 反转字符串II 、151.翻转字符串里的单词8.Day 10| 232.用栈实现队列 、 225. 用队列实现栈9.Day 11 | 20. 有效的括号 、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值10.大厂面试高频题目——其他11.Day 13| 239. 滑动窗口最大值、 347.前 K 个高频元素12.Day14 | 二叉树递归遍历13.Day15 | 102. 二叉树的层序遍历 、226.翻转二叉树 101. 对称二叉树14.大厂面试高频题目-回溯15.Day16 | 104.二叉树的最大深度 、111.二叉树的最小深度 、222.完全二叉树的节点个数16.Day17| 110.平衡二叉树、 257. 二叉树的所有路径 、 404.左叶子之和17.大厂面试高频题——动态规划18.大厂面试高频题目——图论19.Day18 | 513. 找树左下角的值 | 112.路径总和、113.路径总和ii | 105.106.从中序与后(前)序遍历序列构造二叉树20.Day20 | 654.最大二叉树 、 617.合并二叉树 、 700.二叉搜索树中的搜索 98.验证二叉搜索树21.Day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先22.Day22 | 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点23.Day23 | 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树24.Day24| 77. 组合 、216.组合总和III 、17.电话号码的字母组合25.Day 26| 39. 组合总和 、 40.组合总和II 、 131.分割回文串26.Day 27|93.复原IP地址、78.子集 、90.子集II27.Day 28 | 491.递增子序列 、46.全排列、 47.全排列 II28.Day 29 | 455.分发饼干、376. 摆动序列 、53. 最大子序和29.Day 30 | 122.买卖股票的最佳时机II、55. 跳跃游戏 、45.跳跃游戏II、 1005.K次取反后最大化的数组和30.Day 35| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯31.Day 36 | 62.不同路径 、 63. 不同路径 II 、343. 整数拆分、96.不同的二叉搜索树
32.Day 37 | 01背包问题 、416. 分割等和子集
33.Day 38 | 1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零34.Day 40 |完全背包 、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)35.Day 41 | 322. 零钱兑换 、 279.完全平方数、139.单词拆分36.大厂面试高频题——二分查找37.Day 42 | 198.打家劫舍 、213.打家劫舍II、337.打家劫舍III38.Day43 |121. 买卖股票的最佳时机 (只能买卖一次)、122.买卖股票的最佳时机II(可以买卖多次)、123.买卖股票的最佳时机III (最多买卖2次)39.Day 44 | 714.买卖股票的最佳时机含手续费 、309.最佳买卖股票时机含冷冻期40.Day 45 | 300.最长递增子序列 、674. 最长连续递增序列 、718. 最长重复子数组41.Day 47 | 1143.最长公共子序列 、 53. 最大子序和01背包问题 二维dp
https://programmercarl.com/背包理论基础01背包-1.html
视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
思考
dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。
def test_2_wei_bag_problem1():
weight = [1, 3, 4]
value = [15, 20, 30]
bagweight = 4
# 二维数组
dp = [[0] * (bagweight + 1) for _ in range(len(weight))]
# 初始化
for j in range(weight[0], bagweight + 1):
dp[0][j] = value[0]
# weight数组的大小就是物品个数
for i in range(1, len(weight)): # 遍历物品
for j in range(bagweight + 1): # 遍历背包容量
if j < weight[i]:
dp[i][j] = dp[i - 1][j]
else:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
print(dp[len(weight) - 1][bagweight])
test_2_wei_bag_problem1()
01背包问题 一维dp
https://programmercarl.com/背包理论基础01背包-2.html
视频讲解:https://www.bilibili.com/video/BV1BU4y177kY
思考
在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。
思考
使用滚动数组,先物品再背包。背包遍历需要逆序,正序的话上一层的左侧值就被覆盖了,无法滚动。
def test_1_wei_bag_problem():
weight = [1, 3, 4]
value = [15, 20, 30]
bagWeight = 4
# 初始化
dp = [0] * (bagWeight + 1)
for i in range(len(weight)): # 遍历物品
for j in range(bagWeight, weight[i] - 1, -1): # 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bagWeight])
416. 分割等和子集
本题是 01背包的应用类题目
https://programmercarl.com/0416.分割等和子集.html
视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE
思考
暴力回溯太费事了。
转换为01背包问题。背包容量为sum/2,物品重量为nums[i],价值也是nums[i]
dp[i] 背包容量i是否可以装满
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if len(nums)==1:
return False
sum_ = sum(nums)
if sum_ % 2 !=0:
return False
k = int(sum_ / 2)
# dp[i] 背包容量i是否可以装满
dp = [False] * (k+1)
dp[0] = True
for num in nums:
for i in range(k,0,-1):
if i>=num:
dp[i] = dp[i] or dp[i-num]
return dp[k]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?