摘要:
一、回溯算法能解决如下问题: 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 棋盘问题:N皇后,解数独等等 二、回溯法的模板: void backtrac 阅读全文
摘要:
思路 每个腐烂橘子向四周感染一次,直到没有新鲜橘子所需的最少时间。其中一定设计图的遍历,那么是DFS还是BFS?因为要求一层层感染完的最少时间,所以用BFS。即把腐烂橘子放入队列,每次感染一波出队,再把新感染的入队,直到所有腐烂橘子都向四周感染过一次。 为了判断是否有橘子永远不会被感染,还要记录一开 阅读全文
摘要:
单调栈 要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。(有的文章是从栈底到栈顶,本文默认从栈顶到栈底) 怎么能想到用单调栈呢? 什么时候用单调栈呢? 通常是一维数组 阅读全文
摘要:
https://www.programmercarl.com/动态规划-股票问题总结篇.html#买卖股票的最佳时机含手续费 只能买一次 不断更新最小买入值,不断更新profit=prices[i]-buy 可以买卖多次 动态规划 - 定义dp数组 dp[i][1],dp[i][0]分别表示第i天持 阅读全文
摘要:
这道题目是 打家劫舍 III(House Robber III),是打家劫舍系列问题的变种。问题描述如下: 小偷发现了一个新的区域,这个区域的所有房屋排列类似于一棵二叉树。如果两个直接相连的房屋在同一晚被打劫,房屋会自动报警。给定这棵二叉树的根节点 root,求在不触发警报的情况下,小偷能够盗取的最 阅读全文
摘要:
https://www.programmercarl.com/背包总结篇.html#听说背包问题很难-这篇总结篇来拯救你了 阅读全文
摘要:
这道题用代码随想录的解释有点牵强,第二层for循环和递推公式也没有说明白。 代码 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string> set(wordD 阅读全文
摘要:
用dp表示总价值 用dp表示组合数 给出一个总数,一些物品,问能否凑成这个总数。 零钱兑换II https://leetcode.cn/problems/coin-change-ii/ 完全背包 // 先遍历物品,再遍历背包 for(int i = 0; i < weight.size(); i++ 阅读全文
摘要:
思路 尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 背包问题: dp定义:dp[i]表示在容量为i的背包最多可放下重量为dp[i]的石头 递推公式:dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]),要么不选当前的石头(沿用遍历 阅读全文
摘要:
思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。 背包的体积为sum / 2 背包要放入的商品( 阅读全文