刷题日志--回溯 5.5
括号生成
来源:力扣(Leetcode)
链接:https://leetcode.cn/problems/IDBivT/
问题叙述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1
输入
n = 3
输出
[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2
输入
n = 1
输出
[“()”]
提示
1 <= n <= 8
分析
给你N对括号,如果能正确拼出括号序列的话,需要满足,从左往右遍历时,左括号的个数要大于右括号的个数。相反的,如果从左往右遍历时,发现左括号的个数少于右括号的个数,那么一定不能拼出正确的括号序列(自己脑补一下两个左括号,三个右括号)。
下面的代码我是按剩余括号个数算的
- 剪枝条件就是:剩余的左括号个数大于右括号个数。
- 达成条件是:剩余左右括号个数都为0,即用完了。
Code
1 | class Solution { |
路径总和II
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-sum-ii
问题叙述
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1
输入
root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出
[[5,4,11,2],[5,8,4,5]]
示例 2
输入
root = [1,2,3], targetSum = 5
输出
[]
示例 3
输入
root = [1,2], targetSum = 0
输出
[]
提示
树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
Code
1 | class Solution { |
二叉树的所有路径
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-paths
问题叙述
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1
输入
root = [1,2,3,null,5]
输出
[“1->2->5”,“1->3”]
示例 2
输入
root = [1]
输出
[“1”]
提示
树中节点的数目在范围 [1, 100] 内
-100 <= Node.val <= 100
分析
Code
1 | class Solution { |
优美的排列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/beautiful-arrangement
问题叙述
假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 :
perm[i] 能够被 i 整除
i 能够被 perm[i] 整除
给你一个整数 n ,返回可以构造的 优美排列 的 数量 。
示例 1
输入
n = 2
输出
2
解释
第 1 个优美的排列是 [1,2]:
- perm[1] = 1 能被 i = 1 整除
- perm[2] = 2 能被 i = 2 整除
第 2 个优美的排列是 [2,1]:
- perm[1] = 2 能被 i = 1 整除
- i = 2 能被 perm[2] = 1 整除
示例 2
输入
n = 1
输出
1
提示
1 <= n <= 15
分析
有约束条件的全排列问题
Code
1 | class Solution { |