lintcode,全排列

给定一个数字列表,返回其所有可能的排列。
样例
给出一个列表[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;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值