https://leetcode.cn/problems/non-decreasing-subsequences/description/

<aside> 💡

这题不能对原序列进行排序,所以选择使用哈希表进行去重

注意子序列在原数组中不需要连续,所以当不满足条件是使用continue而不是break

</aside>

set

vector<vector<int>> ans;
vector<int> path;

void backtracking(int startIndex, vector<int>& nums) {
		if (path.size() >= 2)
				ans.push_back(path);
		
		// 每层设置一个set来进行树层去重
		// 由于本题nums元素有限定范围,所以也可以使用数组来进行哈希映射
		unordered_set<int> record;
		for (int i = startIndex; i < nums.size(); ++i) {
	      // 第一次使用该值 且 该元素可以组成非递减序列
				if (record.find(nums[i]) == record.end() && (path.empty() || nums[i] >= path.back())) {
						record.insert(nums[i]);
						path.push_back(nums[i]);
						backtracking(i + 1, nums);
						path.pop_back();
				}
		}
}

// 这题不能先排序
vector<vector<int>> findSubsequences(vector<int>& nums) {
		backtracking(0, nums);
		return ans;
}

数组

vector<int> cur;
vector<vector<int>> ans;

void backtracking(int pos, vector<int>& nums) {
    if (cur.size() >= 2) {
        ans.push_back(cur);
    }

    // 使用哈希表进行去重,nums元素有范围限制,所以使用vector作为容器
    vector<int> st(201, 0);
    for (int i = pos; i < nums.size(); ++i) {
        // 非递增 或 本层已经使用过该元素
        if ((!cur.empty() && nums[i] < cur.back()) || st[nums[i] + 100]) {
            continue;
        }
        cur.push_back(nums[i]);
        st[nums[i] + 100] = 1;
        backtracking(i + 1, nums);
        cur.pop_back();
    }
}

vector<vector<int>> findSubsequences(vector<int>& nums) {
    backtracking(0, nums);
    return ans;
}