leetcode 491. 递增子序列
题目详情
题目链接
给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是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]。
- 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。
我的代码
class Solution {
private:
set<vector<int>> results;
int n;
public:
void dealResult(vector<int> &nums, int start, vector<int> result) {
for (int i = start; i < n; ++i) {
if (result.back() <= nums[i]) {
auto temp = result;
temp.push_back(nums[i]);
if (!results.count(temp)) {
results.insert(temp);
dealResult(nums, i + 1, temp);
}
}
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
n = nums.size();
for (int i = 0; i < n - 1; ++i) {
if ((i == 0) || (nums[i] != nums[i - 1])) {
vector<int> result = {nums[i]};
dealResult(nums, i + 1, result);
}
}
return {results.begin(), results.end()};
}
};
我的成绩
执行结果:通过
执行用时:372 ms, 在所有 C++ 提交中击败了10.79%的用户
内存消耗:30.5 MB, 在所有 C++ 提交中击败了15.20%的用户
一些想法
本道题的难点我认为在于对子序列的消除。最后我尝试使用了set来消除重复子序列。
执行用时为 40 ms 的范例
class Solution {
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
vector<vector<int>>res;
vector<int>path;
if(nums.size()==1||nums.size()==0) return res;
// for(int i = 0;i<nums.size();i++)
// {
// dfs(i,path,nums,res);
// }
dfs(0,path,nums,res);
return res;
}
void dfs(int id,vector<int>&path,vector<int>&nums,vector<vector<int>>&res)
{
if(id>=nums.size())
{
if(path.size()>=2)
{
res.push_back(path);
}
return ;
}
if(path.size()==0||nums[id] >= path.back())
{
path.push_back(nums[id]);
dfs(id+1,path,nums,res);
path.pop_back();
}
if(id<nums.size()&&path.size()>0&&nums[id]==path.back()) return ;
dfs(id+1,path,nums,res);
}
};
思考
参见官方解答