代码随想录day29 回溯开始进入排列问题

491.递增子序列

题目

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

示例:

  • 输入: [4, 6, 7, 7]
  • 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

思考

这题初看想用子集的方法来做,但是发现存在一个问题,怎么能判断单调递增呢,这里通过一个判断条件,如果遍历的nums[i]大于path.back(),那么证明这个数大于path内所有的数,可以push back,同时我门需要增加一个set,作用是去重,即如果发现遍历的nums[i]不在set里,那么可以push back,因为每次遍历的时候set都要insert nums[i]

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(vector<int>& nums, int startIndex) {

        if(path.size() > 1) {

            res.push_back(path);

        }

        unordered_set<int> uset;

        for(int i = startIndex;  i < nums.size(); i++) {

            if((path.size() > 0 && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()) continue;

            uset.insert(nums[i]);

            path.push_back(nums[i]);

            backTracking(nums, i+1);

            path.pop_back();

        }

    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {

        backTracking(nums, 0);

        return res;

    }

};

46.全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

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

思考

开始进入到排列问题,其实排列问题和组合问题很像,唯一的区别是组合里[1,2]和[2,1]是同一个,而排列不是,所以排列里不需要startIndex,但是排列也需要used数组来在横向遍历时判断这个数有没有被取过,因为每次横向遍历都是从第0位开始

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(vector<int>& nums, vector<int> used) {

        if(path.size() == nums.size()) {

            res.push_back(path);

            return;

        }

        for(int i = 0; i < nums.size(); i++) {

            if(used[i] == 1) continue;

            path.push_back(nums[i]);

            used[i] = 1;

            backTracking(nums, used);

            used[i] = 0;

            path.pop_back();

        }

    }

    vector<vector<int>> permute(vector<int>& nums) {

        vector<int> used(nums.size(), 0);

        backTracking(nums, used);

        return res;

    }

};

47.全排列 II

题目

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

示例 1:

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

思考

全排列多了一个去重操作,回溯问题的去重操作都是一样的:

if(i > 0 && nums[i] == nums[i-1] && used[i -1] == 0) continue;

还要记得将原数组sort一下

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(vector<int>& nums, vector<int> used) {

        if(path.size() == nums.size()) {

            res.push_back(path);

            return;

        }

        for(int i = 0; i < nums.size(); i++) {

            if(i > 0 && nums[i] == nums[i-1] && used[i -1] == 0) continue;

            if(used[i] == 0) {

                path.push_back(nums[i]);

                used[i] = 1;

                backTracking(nums, used);

                used[i] = 0;

                path.pop_back();

            }

        }

    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {

        sort(nums.begin(), nums.end());

        vector<int> used(nums.size(), 0);

        backTracking(nums, used);

        return res;

    }

};

相关推荐

  1. 代码随想day29 回溯开始进入排列问题

    2024-01-16 23:32:02       54 阅读
  2. 代码随想 day24 回溯算法

    2024-01-16 23:32:02       33 阅读
  3. 代码随想Day29

    2024-01-16 23:32:02       42 阅读

最近更新

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

    2024-01-16 23:32:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-16 23:32:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-16 23:32:02       87 阅读
  4. Python语言-面向对象

    2024-01-16 23:32:02       96 阅读

热门阅读

  1. Python从入门到精通秘籍五

    2024-01-16 23:32:02       63 阅读
  2. c++关键字const

    2024-01-16 23:32:02       50 阅读
  3. 如何在 Edge 浏览器中设置自动刷新?

    2024-01-16 23:32:02       135 阅读
  4. Edge 浏览器设置自动刷新

    2024-01-16 23:32:02       51 阅读
  5. nginx使用入门的笔记

    2024-01-16 23:32:02       50 阅读
  6. C++中的23种设计模式精讲

    2024-01-16 23:32:02       49 阅读
  7. Mock.js使用并且添加到数据库中

    2024-01-16 23:32:02       65 阅读
  8. LeeCode前端算法基础100题(17)- 罗马数字转整数

    2024-01-16 23:32:02       52 阅读
  9. 【Docker Compose】案例分享

    2024-01-16 23:32:02       59 阅读