leetCode 47. 全排列 II + 回溯算法 + 图解 + 笔记

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

示例 1:

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

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

​​​​​​​

>>回溯三部曲:

1).确定回溯函数参数

  • path来收集符合条件的结果
  • result 保存 path,作为结果集
  • used 排列问题需要标记已经选择的元素,和用来记录同一树枝上的元素是否使用过

注意:{1,2}{2,1} 是不同的排序组合,因为排序不同;但 {1,2}{2,1} 是相同的组合,因为元素相同。所以处理组合问题需要 startIndex,处理排列问题就不用使用 startIndex

vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums,vector<bool>& used)

2).递归的终止条件

  • 收割叶子节点
if(path.size() == nums.size()) {
    result.push_back(path);
    return;
}

 3).单层搜索的逻辑 

  • used 是用来标记取过了哪些元素
  • used 是bool型数组,用来记录同一树枝上的元素是否使用过(与leetCode 46.全排列的区别,因为 nums 是可包含重复数字的序列,used有去重作用)
if(i>0 && nums[i]==nums[i-1] && used[i-1]==false) continue; 
if(used[i]==true) continue;

 C++代码:

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums,vector<bool>& used) {
        if(path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++) {
            if(i>0 && nums[i]==nums[i-1] && used[i-1]==false) continue; 
            if(used[i]==true) continue;
            path.push_back(nums[i]);
            used[i]=true;
            backtracking(nums,used);
            used[i]=false;
            path.pop_back();
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<bool> used(nums.size(),false);
        backtracking(nums,used);
        return result;
    }
};
  • 时间复杂度: O(n! * n)
  • 空间复杂度: O(n)

>>与前期文章的区别:

1.leetCode 77.组合问题 、leetCode 131.切割问题、leetCode 78.子集问题需要用startIndex

  • startIndex 来控制for循环的起始位置
  • used 是bool型数组,用来记录同一树枝上的元素是否使用过

 2.本题

  • 每层都是从0开始搜索,并不是startIndex
  • used 是用来标记取过了哪些元素
  • used 是bool型数组,用来记录同一树枝上的元素是否使用过(与leetCode 46.全排列的区别)

我的往期文章:

leetCode 46. 全排列 + 回溯算法 + 图解 + 笔记-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134753366?spm=1001.2014.3001.5501推荐和参考文章、视频:

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://www.programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1R84y1i7Tm/?spm_id_from=333.788&vd_source=a934d7fc6f47698a29dac90a922ba5a3

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-06 01:44:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-06 01:44:06       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-06 01:44:06       82 阅读
  4. Python语言-面向对象

    2023-12-06 01:44:06       91 阅读

热门阅读

  1. hive 命令记录(随时更新)

    2023-12-06 01:44:06       43 阅读
  2. 安全漏洞XSS、CSRF、SQL注入以及DDOS攻击 怎么解决

    2023-12-06 01:44:06       61 阅读
  3. AIGC: 关于ChatGPT中的核心API调用示例

    2023-12-06 01:44:06       56 阅读
  4. PX4 Bug汇总

    2023-12-06 01:44:06       58 阅读
  5. 测试用例的设计思路

    2023-12-06 01:44:06       60 阅读
  6. ES6知识

    ES6知识

    2023-12-06 01:44:06      61 阅读
  7. 基于矢量控制的永磁同步电机调速系统

    2023-12-06 01:44:06       58 阅读
  8. BabySpartan:对non-uniform computation的Lasso-based SNARK

    2023-12-06 01:44:06       59 阅读
  9. Vue-安装及安装相应插件

    2023-12-06 01:44:06       59 阅读