491. Increasing Subsequences

该博客讨论了一个算法问题,即如何从给定的整数数组中找到所有不同的递增子序列,要求至少包含两个元素。通过递归和回溯策略,博主解释了如何避免重复并确保保留同一路径上的重复元素。示例包括输入数组[4,6,7,7]和[4,4,3,2,1],并展示了相应的输出结果。博客中提到的解决方案利用了哈希集来跟踪已使用的数字,以实现有效的回溯过程。
摘要由CSDN通过智能技术生成

题目:

Given an integer array nums, return all the different possible increasing subsequences of the given array with at least two elements. You may return the answer in any order.

The given array may contain duplicates, and two equal integers should also be considered a special case of increasing sequence.

Example 1:

Input: nums = [4,6,7,7]
Output: [[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

Example 2:

Input: nums = [4,4,3,2,1]
Output: [[4,4]]

Constraints:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

思路:

递归的base case是直到字符串的末尾。而加入的case是只要是两个以上的子串即可。显然在[4, 6, 7, 7]中会有两个[4, 6, 7],如果把递归看作树的话,我们要消除的是同一层递归的两个7,而保留同一条路径上的两个7,即[4, 7, 7]和[6, 7, 7]。那么在每一轮递归的时候, 使用一个哈希set来记录是否使用过某一个数字即可,剩下的就是标准回溯了。

代码:

class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums, 0);
        return res;
    }
private:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int>& nums, int index) {
        if (path.size() > 1)
            res.push_back(path);
        if (index == nums.size())
            return;
        unordered_set<int> record;
        for (int i = index; i < nums.size(); i++) {
            if (path.size() == 0 || nums[i] >= path.back()) {
                if (!record.count(nums[i])) {
                    path.push_back(nums[i]);
                    record.insert(nums[i]);
                    backtracking(nums, i + 1);
                    path.pop_back();
                }
            }
        }
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值