Cho mảng số nguyên, tìm tất cả dãy con tăng dần (không giảm) độ dài ≥ 2, loại bỏ trùng lặp.
Ví dụ: [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]].
Thuật toán (Backtracking + Set tại mỗi mức)
- DFS từ vị trí
start, mảng tạmtemp. - Nếu
temp.size()>1→ thêm vào kết quả. - Dùng
set visitedtại mỗi mức để tránh chọn trùng giá trị. - Chỉ thêm
nums[i]nếutemprỗng hoặcnums[i] >= temp.back().
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
vector> res;
void solve(vector& nums, int start, vector& temp) {
if (temp.size() > 1) res.push_back(temp);
set visited;
for (int i=start; i> findSubsequences(vector& nums) {
res.clear();
vector temp;
solve(nums, 0, temp);
return res;
}
};
int main() {
vector v = {4,6,7,7};
Solution ob;
auto ans = ob.findSubsequences(v);
for (auto& seq : ans) {
cout << "[";
for (int x : seq) cout << x << ",";
cout << "] ";
}
return 0;
}
Đầu vào / Đầu ra
Input: [4,6,7,7]
Output: 8 dãy con như mô tả.