刷刷刷 Day 29 | 47. 全排列 II
47. 全排列 II
LeetCode题目要求
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
解题思路
类似全排列,这里存在重复元素,关键在于对去重的处理:if (i > 0 && nums[i] == nums[i-1] && used[i-1] == false)
因为存在重复元素,那么对数组元素进行排序后,就方便去重了。
上代码
class Solution { private List<List<Integer>> res = new ArrayList<>(); private Deque<Integer> path = new LinkedList<>(); boolean[] used = null; public List<List<Integer>> permuteUnique(int[] nums) { if (nums == null || nums.length == 0) { return res; } // 排列过程中使用标识 used = new boolean[nums.length]; Arrays.fill(used, false); // 数组排序 Arrays.sort(nums); backtracking(nums); return res; } private void backtracking(int[] nums) { // 全排列找到所有元素,那么就存储结果 if (nums.length == path.size()) { res.add(new ArrayList<>(path)); return; } for (int i = 0; i < nums.length; i++) { // 去重 if (i > 0 && nums[i] == nums[i-1] && used[i-1] == false) { continue; } // 未使用过的 if (used[i] == false) { used[i] = true; path.add(nums[i]); backtracking(nums); used[i] = false; path.removeLast(); } } } }
重难点
去重
附:学习资料链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了