zoukankan      html  css  js  c++  java
  • leetcode 491. 递增子序列

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

    示例:

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

    说明:

    1. 给定数组的长度不会超过15。
    2. 数组中的整数范围是 [-100,100]。
    3. 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

    这种算法的复杂度O(n^2)

    通过dfs的方法找到第i位数右边所有比它大的数,压并且压到sbuseq中,当subseq的长度大于1的时候就把它压到ans中。这样就能找到所有递增的子序列, 但是可能会出现重复的情况;

    比如上面的[4,6,7,7]通过dfs的方法就会出现两个[4,6,7]的子序列,这里用unorder_set来保存subseq的最后一个元素,当新来的元素和set的最后一个元素相等的时候,就不压入subseq。这样就能避免重复子序列的出现

     1 #include<algorithm>
     2 #include<stack>
     3 class Solution {
     4 public:
     5     void dfs(vector<vector<int>>& ans, vector<int>& subseq, vector<int> nums, int pos){
     6         if(subseq.size()>1) ans.push_back(subseq);
     7         unordered_set<int> hash;
     8         for(int i=pos; i<nums.size(); i++){
     9         if((subseq.empty() || subseq.back()<=nums[i]) && hash.find(nums[i])==hash.end()){
    10             subseq.push_back(nums[i]);
    11             dfs(ans, subseq, nums, i+1);
    12             subseq.pop_back();
    13             hash.insert(nums[i]);
    14         }
    15       }
    16     }
    17     
    18     vector<vector<int>> findSubsequences(vector<int>& nums) {
    19         vector<vector<int>> ans;
    20         vector<int> subseq;
    21         dfs(ans, subseq, nums, 0);
    22         return ans;
    23     }
    24 };

    其实拿到题,知道思路,就是不能联想到怎么实现,对递归的使用还是不熟练,多多积累吧

    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    T4 assembly
    HtmlPrefixScopeExtensions
    PetaPoco修改
    类属性赋值
    Microsoft Office 2007的ContentType
    年月日-正则
    Unity shader学习之逐顶点漫反射光照模型
    Unity3d之表情动画--眨眼
    shader之法线变换
    Unity之fragment shader中如何获得视口空间中的坐标
  • 原文地址:https://www.cnblogs.com/mr-stn/p/9031491.html
Copyright © 2011-2022 走看看