【回溯】B017_LC_递增子序列(去重)

一、Problem

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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]]

说明:

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

二、Solution

方法一:暴搜

思路

如果我们现在已经有一个子序列 cur,下一个元素 A[j] 有两种选择:

  • 加进 cur 中,但条件是:A[j] > cur.back(),j 后面的元素也是如此;
  • 因为本层 set 中存在 A[j] 而不能加到 cur 中,

这只是以某一个元素为开头的子序列,我们还想要以别的元素开头的子序列,这一步可以通过回溯实现

class Solution {
     
public:
	int n;
    set<vector<int>> st;
    vector<int> cur;
	void dfs(int i, vector<int>& A) {
     
		if (cur.size() >= 2) {
     
            st.insert(cur);
        }
		for (int j=i; j<n; j++) if (cur.empty() || A[j]>=cur.back()) {
     
            cur.push_back(A[j]);
            dfs(j+1, A);
            cur.pop_back();
		}
	}
    vector<vector<int>> findSubsequences(vector<int>& A) {
     
    	this->n=A.size(); 
        dfs(0, A);  
    	return vector<vector<int>> (st.begin(), st.end());
    }
};

这里为了方便直接用了 set 去将 ans 中的子数组进行去重…

复杂度分析

  • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度: O ( n ) O(n) O(n)

你可能感兴趣的:(【回溯】B017_LC_递增子序列(去重))