作者:
晚于: 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; }