【DFS】LeetCode 47. 全排列 II
题目链接
思路
借用代码随想录的图。
以最右侧的分支为例,首先将 2
摆在第一位,剩下两个 1
,在走完左边的 1
分支之后,对右边的 1
进行判断,发现右边的 1
还是和左边的一样,摆在第二个位置上(因为 used[i - 1] == false
,说明左边的 1
没有使用)。因此判断出两个树枝搜索出的结果是相同的,进行剪枝。
代码
class Solution {
private List<List<Integer>> result = new ArrayList<>();
private Deque<Integer> path = new ArrayDeque<>();
private boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
used = new boolean[nums.length];
dfs(nums);
return result;
}
void dfs(int[] nums){
if(path.size() == nums.length){
result.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < nums.length; i++){
if(i != 0 && nums[i - 1] == nums[i] && !used[i - 1]){
continue;
}
if(!used[i]){
path.addLast(nums[i]);
used[i] = true;
dfs(nums);
used[i] = false;
path.removeLast();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」