47. 全排列 II 力扣(中等) 手写练习

47. 全排列 II

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

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

题源:https://leetcode-cn.com/problems/permutations-ii/

扩展:

基础版:46. 全排列

代码:

class Solution {
public:
    vector<vector<int>> res;
    
    void dfs(int k, vector<int> nums)
    {
        if(k>=nums.size())
        {
            res.push_back(nums);
            return;
        }
        bool vis[25];
        memset(vis,0,sizeof(vis));

        for(int i=k;i<nums.size();i++)
        {
            if(vis[nums[i]+10]) continue;
            vis[nums[i]+10]=1;   // 因为数字范围是[-10,10,]
            swap(nums[k],nums[i]);
            dfs(k+1,nums);
            swap(nums[k],nums[i]);
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
     // 不能一开始就把nums放入res,会扼杀后面的变动
     dfs(0,nums);   
     return res;
    }
};

 

posted on 2021-07-25 22:29  Yxter  阅读(42)  评论(0编辑  收藏  举报

导航