leetcode 46.全排列 47.全排列II

46.全排列II

给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

思想: 回溯。 不需要额外的vector来存放,只需要在num里面改变顺序,并压入输出的列表中。 num里面的顺序:将首元素与之后的每一个元素交换(让每个元素都成为一次首元素),然后首元素后移一位。

class Solution {
public:
    vector<vector<int>> sb;
    vector<vector<int>> permute(vector<int>& nums) {
        buhuiqumingi(nums,0,nums.size()-1);
        return sb;
    }

    void buhuiqumingi(vector<int> nums,int left, int right){
        if(left==right) 
        {
            sb.push_back(nums);
            return;
        }
        for(int i=left;i<=right;i++){
            swap(nums[left],nums[i]);
            buhuiqumingi(nums,left+1,right);
        }
    }
};

47.全排列II

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

思想:如上一题。但是要注意不能有重复。 只需要将num进行排序,在后面交换顺序时,如果后元素与首元素相同,则跳过,每一次互换位置,后面的序列还是有序的。

code:

class Solution {
public:
    vector<vector<int>> sb;
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        buhuiqumingzi(nums,0,nums.size()-1);
        return sb;
    }
    void buhuiqumingzi(vector<int> nums,int left,int right){
        if(left==right){
            sb.push_back(nums);
            return;
        }
        for(int i=left;i<=right;i++){
            if(i!=left && nums[left]==nums[i]){
                continue;
            }
            swap(nums[i],nums[left]);
            buhuiqumingzi(nums,left+1,right);
        }
    }
};
发布了61 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/surserrr/article/details/103838169