lintcode15- Permutations- medium

Given a list of numbers, return all possible permutations.

 Notice

You can assume that there is no duplicate numbers in the list.

 

Example

For nums = [1,2,3], the permutations are:

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

Challenge

Do it without recursion.


 

 

1. recursion 版本:

和subset类似的递归。三参数current, nums, result。for循环内,满了deepcopy,没满试着加还没有的元素。

subset答案是2n个,permutation的答案是n!个。

所以subset是每次还没填满,按顺序试着加进去后就deepcopy一份。

permutation是每次试着加加看,不断加入还没有的数字,满了再deepcopy一份。通过每一位上面都用for循环跑满来保证不同的顺序。

 

2.非recursion版本

从队伍排列里面获得启发,也就是每次把一个新的元素插入到已有队列里获得新排列嘛。

三重循环。(新元素(当前已有的各种排列(插到的每个位置)))。

因为每次有一变多的过程,所以记得deepcopy。

 

3.思路跟2比较像的recursion版本:

直接递归本函数。每次把nums后面n-1位的作为新数组去调用自身函数,得到的list里在各个位置插入第一个数nums[0]就得到了这层的排列了。

 


 

1.

public class Solution {
    /*
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();

        if (nums == null){
            return null;
        }

        if (nums.length == 0){
            result.add(new ArrayList<Integer>());
            return result;
        }

        helper(new ArrayList<Integer>(), nums, result);
        return result;
    }


    private void helper(List<Integer> current, int[] nums, List<List<Integer>> result){
        if (current.size() == nums.length){
            result.add(new ArrayList<Integer>(current));
        }

        for (int i = 0; i < nums.length; ++i){
            if (current.contains(nums[i])){
                continue;
            }
            current.add(nums[i]);
            helper(current, nums, result);
            current.remove(current.size() - 1);
        }
    }
}

 


2.

 

public class Solution {
    /*
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        result.add(new ArrayList<Integer>());

        if (nums == null){
            return null;
        }

        if (nums.length == 0){
            return result;
        }

        for (int i = 0; i < nums.length; ++i){
            //出现了一变多,所以肯定要deepcopy的。
            List<List<Integer>> newResult = new ArrayList<List<Integer>>();

            for (List<Integer> permutation : result){
                for (int idx = 0; idx <= permutation.size(); ++idx){
                    List<Integer> newPermutation = new ArrayList<Integer>(permutation);
                    newPermutation.add(idx, nums[i]);
                    newResult.add(newPermutation);
                }
            }

            result = newResult;
        }

        return result;
    }
}

 


 

3.

public class Solution {
    /*
     * @param nums: A list of integers.
     * @return: A list of permutations.
     */
    public List<List<Integer>> permute(int[] nums) {
        // write your code here
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (nums == null) {
            return result;
        }
        if (nums.length == 0) {
            result.add(new ArrayList<Integer>());
            return result;
        }
        if (nums.length == 1) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(nums[0]);
            result.add(list);
            return result;
        }
        
        int[] subNums = new int[nums.length - 1];
        for (int i = 1; i < nums.length; i++) {
            subNums[i - 1] = nums[i];
        }
        List<List<Integer>> subPermutes = permute(subNums);
        for (int i = 0; i < nums.length; i++) {
            for (List<Integer> subPermute : subPermutes) {
                List<Integer> newPermute = new ArrayList<Integer>(subPermute);
                newPermute.add(i, nums[0]);
                result.add(newPermute);
            }
        }
        return result;
    }
    
    
}

 

 

 

posted @ 2017-09-21 07:42  jasminemzy  阅读(95)  评论(0编辑  收藏  举报