河北省建设信息网站seo网站优化平台
news/
2025/10/3 17:16:39/
文章来源:
河北省建设信息网站,seo网站优化平台,做网站的主题,微信微网站是什么格式的12.全排列II
题目描述
给定一个可包含重复数字的序列 nums #xff0c;按任意顺序 返回所有不重复的全排列。
示例 1#xff1a;
输入#xff1a;nums [1,1,2]
输出#xff1a;
[[1,1,2],[1,2,1],[2,1,1]]示例 2#xff1a;
输入#xff1a;nums [1,2,3]
输出按任意顺序 返回所有不重复的全排列。
示例 1
输入nums [1,1,2]
输出
[[1,1,2],[1,2,1],[2,1,1]]示例 2
输入nums [1,2,3]
输出[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]题目分析
本题目所描述的全排列存在重复的情况当nums{1,1,2}时就会出现两个[1,1,2]的情况这是由于同一树层两次添加了1这一相同的元素导致所以我们需要对树层的元素进行去重操作1.首先我们将nums数组中的元素进行排序这样有利于我们将相同的元素同一在一起
2.对于树层上的去重当我们发下有两个相邻的重复元素时我们可以进行去重为了防止类似[1,1]这样的元素被去除我们可以观察发现
当nums[i] nums[i - 1] used[i - 1] 0时去重可以避免这种情况
解释在这个条件语句中首先判断 i 是否大于 0这是为了避免数组下标越界。然后判断 nums[i] nums[i - 1]这个条件用来检查当前数字是否与前一个数字相同也就是判断是否存在重复的数字。最后一个条件 used[i - 1] 0 则是用来确保前一个相同的数字已经被使用过如果前一个相同的数字还未被使用那么当前的排列会和之前的排列重复因此需要跳过这种情况。完整代码思路
1.首先定义了两个全局变量 path 和 result分别用于存储当前的路径和最终的结果。path 是一个链表用于暂时存储当前的排列result 是一个列表用于存储所有的排列组合。2.然后定义了一个 permute 方法接受一个整数数组 nums 作为参数并返回所有排列的列表。在该方法中首先初始化了一个长度与 nums 相同的数组 used用于标记每个数字是否被使用过。然后对 nums 数组进行排序以确保重复的数字都相邻。接着调用 backtrack 方法开始搜索排列。3.在 backtrack 方法中首先判断当前的排列长度是否等于 nums 的长度如果是则将当前排列加入到 result 中并返回。接着使用一个循环遍历 nums 数组中的每个元素对于每个元素首先判断是否存在重复的情况如果存在重复且之前的重复数字未被使用则跳过当前循环。然后再判断当前元素是否已经被使用过如果是则跳过当前循环。如果都不满足则将当前元素标记为已使用添加到 path 中然后递归调用 backtrack 方法继续搜索下一层排列。当递归结束后将当前元素从 path 中移除并将其标记为未使用以便尝试其他可能的排列组合。4.通过这样的回溯过程最终可以得到所有的排列组合。Java代码实现
LinkedListInteger path new LinkedList(); // 用于存储当前路径的链表
ListListInteger result new ArrayList(); // 用于存储最终结果的列表public ListListInteger permute(int[] nums) {int[] used new int[nums.length]; // 用于标记数字是否被使用过的数组Arrays.sort(nums); // 对输入的数组进行排序确保相同的数字连续出现backtrack(nums, used, 0); // 调用回溯函数进行全排列return result; // 返回最终结果
}private void backtrack(int[] nums, int[] used, int startIndex) {if (path.size() nums.length) { // 如果当前路径长度等于数组长度说明已经找到一个全排列result.add(new ArrayList(path)); // 将当前路径添加到结果集中return;}for (int i 0; i nums.length; i) {if (i 0 nums[i] nums[i - 1] used[i - 1] 0) continue; // 当前数字与前一个数字相等并且前一个数字未被使用过则跳过当前循环避免重复排列if (used[i] 1) continue; // 如果当前数字已经被使用过则跳过当前循环used[i] 1; // 标记当前数字为已使用path.add(nums[i]); // 将当前数字添加到路径中backtrack(nums, used, startIndex 1); // 递归进入下一层继续寻找全排列path.removeLast(); // 回溯将最后一个数字从路径中移除used[i] 0; // 标记当前数字为未使用以便后续使用}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926121.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!