很经典的回溯算法
1 | func combine(n int, k int) [][]int { |
做了一点剪枝
1 | package main |
很顺理成章的递归
1 | func combinationSum3(k int, n int) [][]int { |
之前刷的时候写的是 BFS 的,这次特意写了个递归的
1 | var m = [][]string{ |
周日休息,去逛了 Gopher China(
1 | func combinationSum(candidates []int, target int) [][]int { |
这道题麻烦的地方在于去重,真得看代码随想录
如果与前一个元素相同且前一个元素没有使用过,则跳过
1 | func combinationSum2(candidates []int, target int) [][]int { |
这道题貌似还可以用 dp
1 | func partition(s string) [][]string { |
细节有点多,需要注意
1 | func restoreIpAddresses(s string) []string { |
一气呵成,非常舒服
1 | func subsets(nums []int) [][]int { |
为了去重,有一点小小的 diff
1 | func subsetsWithDup(nums []int) [][]int { |
这道题去重是关键, 我一开始去重写错了,后来喂给 GPT 他把我教会了
1 | func findSubsequences(nums []int) [][]int { |
这个 map 的作用是在当前层不重复,比如 [4,6,7,7]
,你不去重就会搜到两个 [4,6,7]
而使用 map,当你搜到 4->6
的时候,搜到第一个 7,把 7 标记一下,下一个 7 就能跳过了
向下递归的时候在可选集合中剔除当前元素
1 | func permute(nums []int) [][]int { |
或者你可以使用一个 []bool
标记已经剔除的元素
1 | func permute(nums []int) [][]int { |
与 [40.组合总和 II](#40.组合总和 II) 的去重思路相同,首先排序
然后如果用过,或者与前一个相同并且前一个没用过,就跳过
(当我们有连续的重复元素时,为了避免生成相同的排列,我们只在这些重复元素的第一次出现时考虑它们)
1 | - func permute(nums []int) [][]int { |
泻药,欧拉回路,还是算了
经典 N 皇后,看了一眼,有点忙不想做
一样