ให้อาร์เรย์จำนวนเต็ม หา increasing subsequences ทั้งหมดที่ความยาว ≥ 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]]
วิธีแก้ปัญหา (Backtracking + Dedup per Level)
- ฟังก์ชัน solve(nums, start, temp):
- ถ้า temp.size() > 1 → ใส่ temp ลง res
- visited = เซตว่าง (กันซ้ำในระดับเดียวกัน)
- วน i = start ถึง n-1:
- ถ้า nums[i] ใน visited → ข้าม
- ใส่ nums[i] ลง visited
- ถ้า temp ว่างหรือ temp.back() ≤ nums[i]:
- push nums[i] ลง temp
- solve(nums, i+1, temp)
- pop temp
- จาก main เรียก solve(nums, 0, {}) คืน res
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<int>> v) {
cout << "[";
for (int i = 0; i < v.size(); i++) {
cout << "[";
for (int j = 0; j < v[i].size(); j++) cout << v[i][j] << ", ";
cout << "],";
}
cout << "]" << endl;
}
class Solution {
public:
vector<vector<int>> res;
void solve(vector<int>& nums, int start, vector<int> temp) {
if (temp.size() > 1) res.push_back(temp);
set<int> visited;
for (int i = start; i < nums.size(); i++) {
int x = nums[i];
if (visited.count(x)) continue;
visited.insert(x);
if (temp.empty() || temp.back() <= x) {
temp.push_back(x);
solve(nums, i + 1, temp);
temp.pop_back();
}
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
res.clear();
vector<int> temp;
solve(nums, 0, temp);
return res;
}
};
int main() {
vector<int> v = {4,6,7,8};
Solution ob;
print_vector(ob.findSubsequences(v));
return 0;
}
Input
[4,6,7,8]
Output
[[5, 6, ],[5, 6, 7, ],[5, 6, 7, 8, ],[5, 6, 8, ],[5, 7, ],[5, 7, 8, ],[5, 8, ],[6, 7, ],[6, 7, 8, ],[6, 8, ],[7, 8, ],]