C++ 中的递增子序列
假设我们有一个整数数组,我们的任务是找到给定数组的所有不同的可能的递增子序列,并且递增子序列的长度至少为 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]]。
为了解决这个问题,我们将遵循以下步骤 -
- 定义一个数组,称为 res 用于存储所有结果
- 创建一个名为 solve 的方法。这将接收 nums 数组、start 和 temp 数组
- 如果 temp 的大小 > 1,则将 temp 插入 res
- 创建一个名为 visited 的集合
- 对于 i 在 start 到 nums 大小范围内
- x := nums[i]
- 如果 x 在 visited 集合中,则跳过循环的下一部分
- 将 x 插入 visited 集合
- 如果 temp 为空或 temp 的最后一个元素 <= x,则
- 将 x 插入 temp
- 调用 solve(nums, i + 1, temp)
- 从 temp 的末尾删除一个元素
- 从主方法中,调用 solve(nums, 0, temp)
- 返回 res
让我们看看以下实现以获得更好的理解 -
示例
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > 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[temp.size() - 1] <= 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; } }; main(){ vector<int> v = {5,6,7,8}; Solution ob; print_vector(ob.findSubsequences(v)); }
输入
[4,6,7,8]
输出
[[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, ],]
广告