Permutations [leetcode]

2019-06-02  本文已影响0人  是什么样的心情

Given a collection of distinct numbers, return all possible permutations.
For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]

这道题之前在《算法竞赛入门经典》里看到过,题目相对简单,很容易想到用递归来求解。虽然这道题明确说明排列的值是不同的,但是如果排列的元素里有重复值怎么处理呢?上述书中也有这样的讨论,然而我觉得书里的解释有点不好理解。在下一篇文章里我将给出我的思路。


复杂度

时间 O(nlogn) 空间 O(N)

思路

利用递归求解,将需要排列的数加入已经排列的list里,并将刚刚加入的数从需要排列的list里删去,这样问题规模变成n-1了,递归结束条件是没有剩余的需要排列的数。

代码
public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> list = new ArrayList<List<Integer>>();
    List<Integer> tempList = new ArrayList<Integer>();
    List<Integer> numsList = new ArrayList<Integer>();
    for(int i=0; i<nums.length; i++){
        numsList.add(nums[i]);
    }
    findPermutations(list, tempList, numsList);
    return list;
}

public void findPermutations(List<List<Integer>> list, List<Integer> tempList, List<Integer> nums){
    if(nums.size() < 1){
        list.add(new ArrayList(tempList));
    }
    else{
        for(int i=0; i<nums.size(); i++){
            int temp = nums.remove(0);
            tempList.add(temp);
            findPermutations(list ,tempList, nums);
            tempList.remove((Object)temp);
            nums.add(temp);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读