lintcode,全排列

来源:互联网 发布:php curl 大文件 编辑:程序博客网 时间:2024/04/30 21:42

给定一个数字列表,返回其所有可能的排列。
样例
给出一个列表[1,2,3],其全排列为:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

一刷ac
解题思路:递归或者非递归。递归需要每次置换首位,然后递归后面的字符串,最后在递归结果中加入首位字符。非递归考虑用队列存储每次的排列,再上一次的全排列中,对每个字符串所有可能的位置插入新的字符。

class Solution {    /**     * @param nums: A list of integers.     * @return: A list of permutations.     */    public List<List<Integer>> permute(int[] nums) {        List<List<Integer>> rst = new ArrayList<List<Integer>>();        if(nums == null) return rst;        if(nums.length == 0) {            rst.add(new ArrayList<Integer>());            return rst;        }        if(nums.length == 1){            List<Integer> res = new ArrayList<Integer>();            res.add(nums[0]);            rst.add(res);            return rst;        }        for(int i = 0; i < nums.length; i++){            int[] tmp = new int[nums.length-1];            int start = 0;            for(int j = 0; j < nums.length-1;){                if(start != i){                    tmp[j] = nums[start];                    start++;                    j++;                }else start++;            }            List<List<Integer>> ans = permute(tmp);            for(List<Integer> item : ans)                item.add(0, nums[i]);            rst.addAll(ans);        }        return rst;    }}

非递归

class Solution {    /**     * @param nums: A list of integers.     * @return: A list of permutations.     */    public List<List<Integer>> permute(int[] nums) {        LinkedList<List<Integer>> rst = new LinkedList<List<Integer>>();        if(nums == null) return rst;        rst.add(new ArrayList<Integer>());        for(int num : nums){            int size = rst.size();            for(; size > 0; size--){                List<Integer> tmp = rst.pollFirst();                for(int i = 0; i <= tmp.size(); i++){                    List<Integer> ans = new ArrayList<Integer>(tmp);                    ans.add(i, num);                    rst.add(ans);                }            }        }        return rst;    }}
0 0