Day70 代码随想录打卡|回溯算法篇---递增子序列

题目(leecode T491):

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

Day70 代码随想录打卡|回溯算法篇---递增子序列_第1张图片

方法:本题要求找到无序数组的所有递增序列,和子集问题的思路有类似。需求是要递增且不能重复,这里需要我们加入一些判断条件。同时本题中的去重的条件不能和之前的used数组方式一样,因为used数组中要求我们的nums数组是有序的,但这和我们本题的条件是冲突的,因此只能用unorderedset的方式来去重。分析回溯三部曲

1:传入参数与返回值:数组nums与指定处理位置的startIndex

2:终止条件:无需终止条件,但需要path的长度大于1才能收集结果

3:单层处理条件:需要我们判断每个元素是否是重复的,如不重复再处理,然后就是基础的回溯

题解:

class Solution {
private:
    vector path;
    vector> result;
    void backtracking(vector& nums, int startIndex){
        if(path.size() > 1){                       //收集结果的条件
            result.push_back(path);
        }
        unordered_set uset;                   //只对本层去重
        for(int i = startIndex; i < nums.size(); i++){
            if ((!path.empty() && nums[i] < path.back())|| uset.find(nums[i]) != uset.end()){
                continue;                   //对本层去重且如果数字小于path最后元素就退出
            }
            uset.insert(nums[i]);
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
public:
    vector> findSubsequences(vector& nums) {
        path.clear();
        result.clear();
        backtracking(nums, 0);
        return result;
    }
};

你可能感兴趣的:(算法,数据结构,开发语言,leetcode,职场和发展)