73递增子序列(491)

作者: Turbo时间限制: 1S章节: 深度优先搜索

晚于: 2020-08-26 12:00:00后提交分数乘系数50%

截止日期: 2020-09-02 12:00:00

问题描述 :

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

 

示例:

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

输出: 8

解释:递增子序列包括:[[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]],共8个

说明:

给定数组的长度不会超过15。

数组中的整数范围是 [-100,100]。

给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

 

输入说明 :

首先输入数组元素数目n,然后输入n个整数

输出说明 :

输出一个整数

输入范例 :

输出范例 :

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums)
    {
        vector<vector<int>> res;
        vector<int> path;
        dfs(res,path,nums,0,0,-1000);
        return res;
    }
    void dfs(vector<vector<int>> &res, vector<int> &path, vector<int> nums, int start, int len, int pre_num)
    {
        // 改动1:终止条件实质是loc>num.size(), 本节代码执行完毕开始返回
        if (len >= 2)
        {
            res.push_back(path);
        }
        // 改动2:将要添加的num[i]变小,则跳过;本次将要第二次添加num[i],则跳过,
        //即如果 map 中已经有与 nums[i] 相同的值了,
        //说明加上 nums[i] 后的所有可能的递增序列之前已经被搜过一遍了,因此停止继续搜索。 
        unordered_map<int,int> map;
        for (int i=start; i<nums.size(); ++i)
        {
            if (nums[i]<pre_num || map.find(nums[i])!=map.end())
                continue;
            map[nums[i]] = 1;
            
            path.push_back(nums[i]);
            dfs(res, path, nums, i+1, len+1, nums[i]);
            path.pop_back();            
        }
    }
};
int main()
{
    vector<int> nums;
    int n,data,lower,upper;
    cin>>n;
    for(int j=0; j<n; j++)
    {
        cin>>data;
        nums.push_back(data);
    }
    vector<vector<int>> res=Solution().findSubsequences(nums);
    cout<<res.size()<<endl;
    return 0;
}

 

posted on 2020-09-10 21:09  Hi!Superman  阅读(203)  评论(0编辑  收藏  举报

导航