一种新的方式求解全排列(46. 全排列)

简介: 一种新的方式求解全排列(46. 全排列)

正文


1. 题目表述


给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]输出:

[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]


2.编写代码


class Solution {
   int[] tag;
   int[] temp;
   List<List<Integer>> permute=new ArrayList<>();
   public List<List<Integer>> permute(int[] nums) {
       tag = new int[nums.length];
       temp = new int[nums.length];
       int index = 0;
       for (int i = 0; i < nums.length; i++) {
           if (tag[i] == 0) {
               tag[i] = 1;
               temp[i] = nums[index];
               permute(nums, index+1);
               tag[i] = 0;
          }
      }
       return permute;
  }
   private void permute(int[] nums, int i) {
       if (i < nums.length) {
           for (int j = 0; j < nums.length; j++) {
               if (tag[j] == 0) {
                   tag[j] = 1;
                   temp[j] = nums[i];
                   permute(nums, i+1);
                   tag[j] = 0;
              }
          }
      }else {
           ArrayList<Integer> objects = new ArrayList<>();
           for (int j = 0; j < nums.length; j++) {
               objects.add(temp[j]);
          }
           permute.add(objects);
           //System.out.println(Arrays.toString(temp));
      }
  }
}


3. 代码的思路


该题求解的是全排列,思考了一下,我发现可以用标记数组以及中间数组的方式就可以解决我们的问题,在用递归的方式即可解答。

运行结果:

12.png

相关文章
|
6月前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
87 0
|
5月前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
6月前
|
算法
回溯-求出数组的所有子序列【学习算法】
回溯-求出数组的所有子序列【学习算法】
48 0
|
机器学习/深度学习 存储 算法
算法训练Day29|* 491.递增子序列* 46.全排列* 47.全排列 II
算法训练Day29|* 491.递增子序列* 46.全排列* 47.全排列 II
|
存储 Java C++
力扣题目-两数相加(迭代递归,常用3种语言实现)
力扣题目-两数相加(迭代递归,常用3种语言实现)
115 0
|
算法
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
【递归与递推 3】AcWing 717. 简单斐波那契(求解斐波那契数列的若干方法)
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
|
机器学习/深度学习 人工智能 算法
『递归』汉诺塔和全排列
使用递归编写一个程序实现汉诺塔问题,要求在输入圆盘数量之后,输出圆盘的移动步骤,输出格式示例如下: 第1步:1号盘从A柱移至B柱第2步:2号盘从A柱移至C柱
221 0
LeetCode 2040. 两个有序数组的第 K 小乘积(嵌套二分查找)
LeetCode 2040. 两个有序数组的第 K 小乘积(嵌套二分查找)
246 0
|
算法
数列最值的递归解法
在看到辗转相除法的递归解法后,不禁想到涉及比较的分治算法、三目运算符和递归简直就是绝配,一眨眼,脑海中就迸出了数列最小值的递归解法,每一个数都与后面数组的最小值相比较,思路有了,动手吧。 //辗转相除法    int gcd_division(int a,int b)   {       return b==0?a:gcd_division(b,a%b);    }     一、思路与改进     将数组每一个元素与该元素后数组最小值相比较,最后一个数组元素返回自身,即可得到整个数组的最小值。
1067 0