leetcode系列(55)Permutations, Permutations II

来源:互联网 发布:mac 菜单栏的锁不见了 编辑:程序博客网 时间:2024/05/21 09:12

Given acollection of numbers, return all possible permutations.

Forexample,
[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].

解答:这两个题目的区别就是区分重复元素,第二题的解法也是适用于第一题的,所以这里给出第一题的代码(swap+递归实现排列);如果用python会遇到一个坑就是pytho的list append时deafult不会深度拷贝,所以ret.append(nums)不会AC,需要ret.append(nums[:]),看下面例子:

>>>a = '1'>>>print id(a)3075358016>>>l = []>>>l.append(a)>>>print id(l[0])3075358016>>>print l['1']>>>b = [1,2]>>>print id(b)3072493388>>>l.append(b)>>>print id(l[1])3072493388 >>>l = [1,2]>>>c = [1,2,3]>>>>>>c = [1,2]>>>print id(c)3072833388>>>l.append(c)>>>print id(l[2])3072833388>>>l.append(c[:])>>>print id(l[3])3075373068

Permutation

class Solution {public:    vector<vector<int>> permute(vector<int>& nums) {        vector<vector<int>> ret;        permute(ret, nums, 0);        return ret;    }    private:    void permute(vector<vector<int>>& ret, vector<int>& nums, size_t start) {        if (start == nums.size()) {            ret.push_back(nums);        } else {            for (size_t i = start; i < nums.size(); ++i) {                // ignore the item that already exist in nums[start, i) when i > start                if (i > start && find(nums.begin() + start, nums.begin() + i, nums[i]) != (nums.begin() + i)) {                    continue;                }                swap(nums[start], nums[i]);                permute(ret, nums, start + 1);                swap(nums[start], nums[i]);            }        }    }};
class Solution(object):    def permute(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        ret = []        self._permute(ret, nums, 0)        return ret        def _permute(self, ret, nums, start):        if start == len(nums):            # don't append nums directly, append nums[:] insteand to force deep copy            ret.append(nums[:])         else:            for i in range(start, len(nums)):                nums[start], nums[i] = nums[i], nums[start]                self._permute(ret, nums, start + 1)                nums[start], nums[i] = nums[i], nums[start]

Permutation II

class Solution {public:    vector<vector<int>> permuteUnique(vector<int>& nums) {        vector<vector<int>> ret;        permute(ret, nums, 0);        return ret;    }    private:    void permute(vector<vector<int>>& ret, vector<int>& nums, size_t start) {        if (start == nums.size()) {            ret.push_back(nums);        }        for (size_t i = start; i < nums.size(); ++i) {            // ignore the item that already exist in nums[start, i) when i > start            if (i > start && find(nums.begin() + start, nums.begin() + i, nums[i]) != (nums.begin() + i)) {                continue;            }            swap(nums[start], nums[i]);            permute(ret, nums, start + 1);            swap(nums[start], nums[i]);        }    }};

class Solution(object):    def permuteUnique(self, nums):        """        :type nums: List[int]        :rtype: List[List[int]]        """        ret = []        self._permute(ret, nums, 0)        return ret        def _permute(self, ret, nums, start):        if start == len(nums):            # don't append nums directly, append nums[:] insteand to force deep copy            ret.append(nums[:])         else:            for i in range(start, len(nums)):                if i > start and nums[i] in nums[start:i]:                    continue                nums[start], nums[i] = nums[i], nums[start]                self._permute(ret, nums, start + 1)                nums[start], nums[i] = nums[i], nums[start]




0 0
原创粉丝点击