73遞增子序列(491)
阿新 • • 發佈:2020-09-10
作者:
晚於: 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; }