回溯法实现全排序Ⅰ

Toretto·2022-10-02 20:19·1108 次阅读

回溯法实现全排序Ⅰ

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

Copy
示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3: 输入:nums = [1] 输出:[[1]]

存放于数组A的n个元素,生成其排列:

  1. 第一个元素不动,生成后面n-1个元素的排列;
  2. 第一、第二个元素互换,生成后面n-1个元素的排列;
  3. 最后,第一个、第n个元素互换,生成后面n-1个元素的排列

为生成后面n-1个元素的排列,继续采取下面的步骤:

  1. 第二个元素不动,生成后面n-2个元素的排列;
  2. 第二、第三个元素互换,生成后面n-2个元素的排列;
  3. 最后,第二个、第n个元素互换,生成后面n-2个元素的排列;

当排列的前n-2个元素已确定后,为生成后面2个元素的排列,可以:

  1. 第n-1个元素不动,生成后面1个元素的排列,此时,n个元素已构成排列;

  2. 第n-1、第n个元素互换,生成后面1个元素的排列,此时,n个元素已构成排列;

Java代码#

Copy
class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); List<Integer> output = new ArrayList<Integer>(); for (int num : nums) { output.add(num); } int n = nums.length; backtrack(n, output, res, 0); return res; } public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) { // 所有数都填完了 if (first == n) { res.add(new ArrayList<Integer>(output)); } for (int i = first; i < n; i++) { // 动态维护数组 Collections.swap(output, first, i); // 继续递归填下一个数 backtrack(n, output, res, first + 1); // 撤销操作 Collections.swap(output, first, i); } } }

注:

(1)以下是java.util.Collections.swap()方法的声明。

Copy
public static void swap(List<?> list,int i,int j)
参数
  • ​ list-- 在该列表中的调剂元素。
  • ​ i-- 要交换的一个元素的索引。
  • ​ j-- 要交换的其它元素的索引。

(2)

软件维护主要是指根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改

C++代码#

Copy
class Solution { public: void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){ // 所有数都填完了 if (first == len) { res.emplace_back(output); return; } for (int i = first; i < len; ++i) { // 动态维护数组 swap(output[i], output[first]); // 继续递归填下一个数 backtrack(res, output, first + 1, len); // 撤销操作 swap(output[i], output[first]); } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int> > res; backtrack(res, nums, 0, (int)nums.size()); return res; } };

image

以上代码转自力扣题解。笔者自己画图总结出来的解析。

posted @   Galaxy不写bug  阅读(1108)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
目录