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

  • Post author:
  • Post category:其他


【例】

输入: [1,2,3]

输出:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

此题运用回溯法 剪枝

Java中实际上提供了

java.util.Stack

来实现栈结构,但官方目前已不推荐使用,而是使用

java.util.Deque

双端队列来实现队列与栈的各种需求

import java.util.ArrayDeque;

import java.util.ArrayList;

import java.util.Deque;

import java.util.List;

class Solution {

public static List<List<Integer>> permute(int[] nums) {

List<List<Integer>> list =new ArrayList<List<Integer>>();

def(new ArrayDeque<Integer>(), 0, nums.length, nums ,list);

return list;

}

//Deque<Integer> path 存放访问的路径节点

// now 当前访问的节点数,用来结算

//length 访问的节点总数

static void def(Deque<Integer> path ,int now , int length , int[] nums ,List<List<Integer>> list ) {

//结算路径

if(now == length) {

list.add(new ArrayList<Integer>(path));

}

for (int i = 0; i < nums.length; i++) {

//如果节点已经被访问,跳过

if(path.contains(nums[i])) {

continue;

}

//加入节点

path.addLast(nums[i]);

//回溯调用

def(path, now+1, length, nums, list);

//把加入的节点删除,用于下一次循环进行其他组合的递归,

// 若加入节点前的path=[1]  访问的节点为2 那么加入节点后的path[1,2]  为了不影响路径 path结果值[1,3],所以应当把path恢复到节点2加入之前的场景 path = [1] 当 访问节点为3的时候可以生成path[1,3]

path.removeLast();

}

}

}



版权声明:本文为hieya原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。