回溯算法
回溯算法
1、组合
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
1 | 输入:n = 4, k = 2 |
示例 2:
1 | 输入:n = 1, k = 1 |
提示:
1 <= n <= 20
1 <= 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 <= 9
1 <= 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 <= 4
digits[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 <= 30
2 <= candidates[i] <= 40
candidates
的所有元素 互不相同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 <= 100
1 <= candidates[i] <= 50
1 <= 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 <= 16
s
仅由小写英文字母组成
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 <= 20
s
仅由数字组成
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] <= 10
nums
中的所有元素 互不相同
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] <= 10
nums
中的所有整数 互不相同
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 <= 300
tickets[i].length == 2
fromi.length == 3
toi.length == 3
fromi
和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 == 9
board[i].length == 9
board[i][j]
是一位数字或者'.'
- 题目数据 保证 输入数独仅有一个解
1 | class Solution { |
install_url
to use ShareThis. Please set it in _config.yml
.