摘要:
要分成两个子集,且它们的和相等 那么我们可以从原数组的总和中得到这两个子集的和是多少 进而问题转成能不能从数组中选取元素使得它们的总和恰好是这个子集和 也就是 01背包问题 class Solution { public: bool canPartition(vector<int>& a) { in 阅读全文
posted @ 2026-03-26 22:08
rdcamelot
阅读(19)
评论(0)
推荐(0)
摘要:
首先这题的路径是限制了从一个节点到它子节点这样的简单路径,而不是一般的例如树的直径的那种形式 比较容易想到的就是自底向上传递信息,或者就是说 dfs 先获取左子树和右子树的信息,然后计算答案 进而考虑我们需要什么信息,因为路径是简单链,所以就是子树那条链上的值的后缀和,每一轮向上传递,实际就是在子节 阅读全文
posted @ 2026-03-26 20:59
rdcamelot
阅读(22)
评论(0)
推荐(0)
摘要:
异位词就是长度相同的字符串中各个字母的出现次数相同 因为 p 的长度是固定的 而且 s 的长度是 \(3*10^4\) ,因此不妨直接遍历 s 的起点,判断从它开始的子串是否满足我们的要求,O(n) 是可以接受的 每次移动,相应把对应字符删除/增加到计数器中 class Solution { pub 阅读全文
posted @ 2026-03-26 15:23
rdcamelot
阅读(20)
评论(0)
推荐(0)
摘要:
直接的做法比较显然 主要是学习下这里的原地修改策略,即空间复杂度 O(1) https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/solutions/601946/zhao-dao-suo-you-shu-zu-z 阅读全文
posted @ 2026-03-26 14:39
rdcamelot
阅读(16)
评论(0)
推荐(0)
摘要:
异或得到二进制上不同的数 接着用 popcount 数这个数二进制中的 1 的个数 class Solution { public: int hammingDistance(int x, int y) { x ^= y; return __builtin_popcount(x); } }; 阅读全文
posted @ 2026-03-26 14:26
rdcamelot
阅读(13)
评论(0)
推荐(0)
摘要:
紧接着前一题零钱,这里能看出来也是 DP ,因为我们要求方案数 区别就在于这里的每个元素只能使用一次 先从结果出发,我们是要求 target 的方案数是多少 那么状态就是设计成 dp[i] 表示表达式是 i 的方案数是多少 接着枚举每个元素,因为是可加可减,所以 ndp[i] = dp[i - a[ 阅读全文
posted @ 2026-03-26 14:08
rdcamelot
阅读(18)
评论(0)
推荐(0)
摘要:
背包问题 实际上依然是从 dp 的角度来考虑 令 dp[i] 表示达到 i 的最小花费 那么考虑 dp[i] 怎么来,那当然是遍历 dp[i - j],取最小值 +1 1 <= coins.length <= 12 很小,所以每次都直接遍历即可 硬币取无限次就在于每一轮的更新中了,以为比如 3 = 阅读全文
posted @ 2026-03-26 00:40
rdcamelot
阅读(18)
评论(0)
推荐(0)

浙公网安备 33010602011771号