回溯法实现全排序Ⅰ

打印 上一主题 下一主题

主题 644|帖子 644|积分 1932

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
  1. 示例 1:
  2. 输入:nums = [1,2,3]
  3. 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
  4. 示例 2:
  5. 输入:nums = [0,1]
  6. 输出:[[0,1],[1,0]]
  7. 示例 3:
  8. 输入:nums = [1]
  9. 输出:[[1]]
复制代码
存放于数组A的n个元素,生成其排列:

  • 第一个元素不动,生成后面n-1个元素的排列;
  • 第一、第二个元素互换,生成后面n-1个元素的排列;
  • 最后,第一个、第n个元素互换,生成后面n-1个元素的排列
为生成后面n-1个元素的排列,继续采取下面的步骤:

  • 第二个元素不动,生成后面n-2个元素的排列;
  • 第二、第三个元素互换,生成后面n-2个元素的排列;
  • 最后,第二个、第n个元素互换,生成后面n-2个元素的排列;
当排列的前n-2个元素已确定后,为生成后面2个元素的排列,可以:

  • 第n-1个元素不动,生成后面1个元素的排列,此时,n个元素已构成排列;
  • 第n-1、第n个元素互换,生成后面1个元素的排列,此时,n个元素已构成排列;
Java代码
  1. class Solution {
  2.     public List<List<Integer>> permute(int[] nums) {
  3.         List<List<Integer>> res = new ArrayList<List<Integer>>();
  4.         List<Integer> output = new ArrayList<Integer>();
  5.         for (int num : nums) {
  6.             output.add(num);
  7.         }
  8.         int n = nums.length;
  9.         backtrack(n, output, res, 0);
  10.         return res;
  11.     }
  12.     public void backtrack(int n, List<Integer> output, List<List<Integer>> res, int first) {
  13.         // 所有数都填完了
  14.         if (first == n) {
  15.             res.add(new ArrayList<Integer>(output));
  16.         }
  17.         for (int i = first; i < n; i++) {
  18.             // 动态维护数组
  19.             Collections.swap(output, first, i);
  20.             // 继续递归填下一个数
  21.             backtrack(n, output, res, first + 1);
  22.             // 撤销操作
  23.             Collections.swap(output, first, i);
  24.         }
  25.     }
  26. }
复制代码
注:
(1)以下是java.util.Collections.swap()方法的声明。
  1. public static void swap(List<?> list,int i,int j)
复制代码
参数


  • ​                        list-- 在该列表中的调剂元素。
  • ​                        i-- 要交换的一个元素的索引。
  • ​                        j-- 要交换的其它元素的索引。
(2)
软件维护主要是指根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改
C++代码
  1. class Solution {
  2. public:
  3.     void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
  4.         // 所有数都填完了
  5.         if (first == len) {
  6.             res.emplace_back(output);
  7.             return;
  8.         }
  9.         for (int i = first; i < len; ++i) {
  10.             // 动态维护数组
  11.             swap(output[i], output[first]);
  12.             // 继续递归填下一个数
  13.             backtrack(res, output, first + 1, len);
  14.             // 撤销操作
  15.             swap(output[i], output[first]);
  16.         }
  17.     }
  18.     vector<vector<int>> permute(vector<int>& nums) {
  19.         vector<vector<int> > res;
  20.         backtrack(res, nums, 0, (int)nums.size());
  21.         return res;
  22.     }
  23. };
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

何小豆儿在此

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表