• 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;
    }
  • 相关阅读:
    如何通过 Vue-Cli3
    Vue简单了解
    年后跳槽如何准备?
    2016年1月-前端开发月刊
    前端如何正确选择offer,到底选哪个?
    前端应聘要准备些什么样子的作品?
    如何看待豪情的前端群的群规?
    前端工程师如何打发闲余时光?
    页面重构时的注意事项
    我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
  • 原文地址:https://www.cnblogs.com/zmmm/p/13648412.html
Copyright © 2020-2023  润新知