1. 程式人生 > 實用技巧 >73遞增子序列(491)

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; }