回溯算法
回溯算法
1、组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
1 | 输入:n = 4, k = 2 |
示例 2:
1 | 输入:n = 1, k = 1 |
提示:
1 <= n <= 201 <= k <= n
1 | class Solution { |
2、组合优化
1 | class Solution { |
3. 组合总和III
https://leetcode.cn/problems/combination-sum-iii/description/
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
1 | 输入: k = 3, n = 7 |
示例 2:
1 | 输入: k = 3, n = 9 |
示例 3:
1 | 输入: k = 4, n = 1 |
提示:
2 <= k <= 91 <= n <= 60
1 | class Solution { |
4. 电话号码的字母组合
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
1 | 输入:digits = "23" |
示例 2:
1 | 输入:digits = "" |
示例 3:
1 | 输入:digits = "2" |
提示:
0 <= digits.length <= 4digits[i]是范围['2', '9']的一个数字。
1 | class Solution { |
5.组合总和
https://leetcode.cn/problems/combination-sum/description/
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1:
1 | 输入:candidates = [2,3,6,7], target = 7 |
示例 2:
1 | 输入: candidates = [2,3,5], target = 8 |
示例 3:
1 | 输入: candidates = [2], target = 1 |
提示:
1 <= candidates.length <= 302 <= candidates[i] <= 40candidates的所有元素 互不相同1 <= target <= 40
1 | class Solution { |
6.组合总和II
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
1 | 输入: candidates = [10,1,2,7,6,1,5], target = 8, |
示例 2:
1 | 输入: candidates = [2,5,2,1,2], target = 5, |
提示:
1 <= candidates.length <= 1001 <= candidates[i] <= 501 <= target <= 30
1 | class Solution { |
6. 分割回文串
https://leetcode.cn/problems/palindrome-partitioning/
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是
回文串
。返回 s 所有可能的分割方案。
示例 1:
1 | 输入:s = "aab" |
示例 2:
1 | 输入:s = "a" |
提示:
1 <= s.length <= 16s仅由小写英文字母组成
1 | class Solution { |
7.复原IP地址
https://leetcode.cn/problems/restore-ip-addresses/description/
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
- 例如:
"0.1.2.201"和"192.168.1.1"是 有效 IP 地址,但是"0.011.255.245"、"192.168.1.312"和"192.168@1.1"是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
1 | 输入:s = "25525511135" |
示例 2:
1 | 输入:s = "0000" |
示例 3:
1 | 输入:s = "101023" |
提示:
1 <= s.length <= 20s仅由数字组成
1 | class Solution { |
8.子集问题
https://leetcode.cn/problems/subsets/
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
1 | 输入:nums = [1,2,3] |
示例 2:
1 | 输入:nums = [0] |
提示:
1 <= nums.length <= 10-10 <= nums[i] <= 10nums中的所有元素 互不相同
1 | class Solution { |
9.子集II
https://leetcode.cn/problems/subsets-ii/description/
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的
子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
1 | 输入:nums = [1,2,2] |
示例 2:
1 | 输入:nums = [0] |
提示:
1 <= nums.length <= 10-10 <= nums[i] <= 10
1 | import java.util.List; |
1 | import java.util.List; |
10、递增子序列
https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
1 | 输入:nums = [4,6,7,7] |
示例 2:
1 | 输入:nums = [4,4,3,2,1] |
提示:
1 <= nums.length <= 15-100 <= nums[i] <= 100
1 | class Solution { |
11、全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
1 | 输入:nums = [1,2,3] |
示例 2:
1 | 输入:nums = [0,1] |
示例 3:
1 | 输入:nums = [1] |
提示:
1 <= nums.length <= 6-10 <= nums[i] <= 10nums中的所有整数 互不相同
1 | class Solution { |
12、全排列II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
1 | 输入:nums = [1,1,2] |
示例 2:
1 | 输入:nums = [1,2,3] |
提示:
1 <= nums.length <= 8-10 <= nums[i] <= 10
1 | class Solution { |
13、重新安排行程
给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
- 例如,行程
["JFK", "LGA"]与["JFK", "LGB"]相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
示例 1:

1 | 输入:tickets = [["MUC","LHR"],["JFK","MUC"],["SFO","SJC"],["LHR","SFO"]] |
示例 2:

1 | 输入:tickets = [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]] |
提示:
1 <= tickets.length <= 300tickets[i].length == 2fromi.length == 3toi.length == 3fromi和toi由大写英文字母组成fromi != toi
1 | class Solution { |
PriorityQueue 是一种特殊的队列,它按照优先级来处理队列中的元素,而不是按照元素被插入队列的顺序。在 PriorityQueue 中,元素的优先级决定了它们的出队顺序。通常,优先级高的元素会先被处理。它在许多算法和数据结构中都有应用,尤其是在需要按优先级进行调度、排序、合并等操作的场景中。
Java 中的 PriorityQueue
在 Java 中,PriorityQueue 是一个实现了 Queue 接口的类,它提供了一个基于堆(通常是最小堆)实现的队列。它会按照元素的自然顺序或通过传递的 Comparator 来决定优先级。
主要特点:
- 最小堆(Min-Heap):
- 默认情况下,
PriorityQueue使用自然顺序(元素的比较方法,如数字的大小或字符串的字典顺序),这意味着队列中最小的元素会先被移除。 - 可以通过传入
Comparator来改变优先级的顺序,使用最大堆(Max-Heap)或自定义顺序。
- 默认情况下,
- 无界队列:
PriorityQueue默认没有容量限制,元素数量只受可用内存的限制。
- 线程不安全:
PriorityQueue不是线程安全的,如果多个线程并发操作同一个队列,需要使用外部同步机制,或者使用PriorityBlockingQueue来替代。
基本操作:
add(E e)/offer(E e):向队列添加元素。remove()/poll():移除并返回队列中优先级最高的元素(对于最小堆,就是最小的元素)。peek():返回队列中优先级最高的元素,但不移除它。size():返回队列中元素的数量。clear():清空队列中的所有元素。
1 | ``` |
输入:n = 4
输出:[[“.Q..”,”…Q”,”Q…”,”..Q.”],[“..Q.”,”Q…”,”…Q”,”.Q..”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
1 |
|
输入:n = 1
输出:[[“Q”]]
1 |
|
15、解数独
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9在每一行只能出现一次。 - 数字
1-9在每一列只能出现一次。 - 数字
1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:

1 | 输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] |
提示:
board.length == 9board[i].length == 9board[i][j]是一位数字或者'.'- 题目数据 保证 输入数独仅有一个解
1 | class Solution { |
install_url to use ShareThis. Please set it in _config.yml.