• 491. 递增子序列


    题目链接:

    力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

    思路:

            注意的点:1.是在原有的序列里找递增的子序列         

    示例 2:

    输入:nums = [4,4,3,2,1]
    输出:[[4,4]]

    记一个错误代码:

     与上一个篇90. 子集 II_侯孟禹的博客-CSDN博客区别在于push进result的时候判断了长度

    1. class Solution {
    2. public:
    3. vectorint>> result;
    4. vector<int> path;
    5. vectorint>> findSubsequences(vector<int>& nums) {
    6. sort(nums.begin(), nums.end());
    7. backtracking(nums, 0);
    8. return result;
    9. }
    10. void backtracking(vector<int>& nums, int startIndex)
    11. {
    12. if(startIndex > nums.size())
    13. {
    14. return;
    15. }
    16. if(path.size() >= 2)
    17. {
    18. result.push_back(path);
    19. }
    20. unordered_set<int> uset;
    21. for(int i = startIndex; i < nums.size(); i++)
    22. {
    23. if(uset.find(nums[i]) != uset.end())
    24. {
    25. continue;
    26. }
    27. uset.insert(nums[i]);
    28. path.push_back(nums[i]);
    29. backtracking(nums, i + 1);
    30. path.pop_back();
    31. }
    32. }
    33. };

    结果:

     看到这个结果想到:1.首先把排序去掉(根据上一篇预测会出现重复) 2.加上长度判断 3.加上是否递增判断

    我写的错误代码: 

    for里判断条件处理不好

    1. class Solution {
    2. public:
    3. vectorint>> result;
    4. vector<int> path;
    5. vectorint>> findSubsequences(vector<int>& nums) {
    6. // sort(nums.begin(), nums.end());
    7. // path.push_back(nums[0]);
    8. backtracking(nums, 0);
    9. return result;
    10. }
    11. void backtracking(vector<int>& nums, int startIndex)
    12. {
    13. if(startIndex > nums.size())
    14. {
    15. return;
    16. }
    17. if(path.size() >= 2)
    18. {
    19. result.push_back(path);//第一次进来会把空集放进去
    20. }
    21. unordered_set<int> uset;
    22. for(int i = startIndex; i < nums.size(); i++)
    23. {
    24. if(uset.find(nums[i]) != uset.end())
    25. {
    26. continue;
    27. }
    28. if(path.size() == 0 )
    29. {
    30. uset.insert(nums[i]);
    31. path.push_back(nums[i]);
    32. }
    33. else
    34. {
    35. if(nums[i-1] > nums[i])
    36. {
    37. continue;
    38. }
    39. uset.insert(nums[i]);
    40. path.push_back(nums[i]);
    41. }
    42. backtracking(nums, i + 1);
    43. path.pop_back();
    44. }
    45. }
    46. };

    结果:

    根据随想录代码修修补补:

     正确运行

    1. class Solution {
    2. public:
    3. vectorint>> result;
    4. vector<int> path;
    5. vectorint>> findSubsequences(vector<int>& nums) {
    6. // sort(nums.begin(), nums.end());
    7. // path.push_back(nums[0]);
    8. backtracking(nums, 0);
    9. return result;
    10. }
    11. void backtracking(vector<int>& nums, int startIndex)
    12. {
    13. if(startIndex > nums.size())
    14. {
    15. return;
    16. }
    17. if(path.size() >= 2)
    18. {
    19. result.push_back(path);//第一次进来会把空集放进去
    20. }
    21. unordered_set<int> uset;
    22. // for(int i = startIndex; i < nums.size(); i++)
    23. // {
    24. // if(uset.find(nums[i]) != uset.end())
    25. // {
    26. // continue;
    27. // }
    28. // if(path.size() == 0 )
    29. // {
    30. // uset.insert(nums[i]);
    31. // path.push_back(nums[i]);
    32. // }
    33. // else
    34. // {
    35. // if(nums[i-1] > nums[i])
    36. // {
    37. // continue;
    38. // }
    39. // uset.insert(nums[i]);
    40. // path.push_back(nums[i]);
    41. // }
    42. // backtracking(nums, i + 1);
    43. // path.pop_back();
    44. for (int i = startIndex; i < nums.size(); i++) {
    45. if ((!path.empty() && nums[i] < path.back())
    46. || uset.find(nums[i]) != uset.end()) {
    47. continue;
    48. }
    49. uset.insert(nums[i]); // 记录这个元素在本层用过了,本层后面不能再用了
    50. path.push_back(nums[i]);
    51. backtracking(nums, i + 1);
    52. path.pop_back();
    53. }
    54. }
    55. };

    随想录代码(正确):

    1. // 版本一
    2. class Solution {
    3. private:
    4. vectorint>> result;
    5. vector<int> path;
    6. void backtracking(vector<int>& nums, int startIndex) {
    7. if (path.size() > 1) {
    8. result.push_back(path);
    9. // 注意这里不要加return,要取树上的节点
    10. }
    11. unordered_set<int> uset; // 使用set对本层元素进行去重
    12. for (int i = startIndex; i < nums.size(); i++) {
    13. if ((!path.empty() && nums[i] < path.back())
    14. || uset.find(nums[i]) != uset.end()) {
    15. continue;
    16. }
    17. uset.insert(nums[i]); // 记录这个元素在本层用过了,本层后面不能再用了
    18. path.push_back(nums[i]);
    19. backtracking(nums, i + 1);
    20. path.pop_back();
    21. }
    22. }
    23. public:
    24. vectorint>> findSubsequences(vector<int>& nums) {
    25. result.clear();
    26. path.clear();
    27. backtracking(nums, 0);
    28. return result;
    29. }
    30. };

  • 相关阅读:
    【数据结构与算法分析】0基础带你学数据结构与算法分析05--串 (string)
    深入理解HTTPS协议原理
    RedisSyncer 中采用链式策略处理同步数据
    过了那么多1024节才知道……
    南大通用数据库-Gbase-8a-学习-05-通过审计日志抓取Sql、Trace日志查看执行计划
    elementUI文档的小细节怎么实现?
    达梦数据库之 PERCENT_RANK()over()函数和 PERCENTILE_CONT() WITHIN GROUP()OVER()函数详解
    关于Qt 加载网页(二) QWebenginePage和QWebengineView傻傻分不清楚
    Python - 深度学习系列38 重塑实体识别5-预测并行化改造
    初探802.11协议(5)——MIMO/MU-MIMO/OFDMA概念介绍
  • 原文地址:https://blog.csdn.net/weixin_44965579/article/details/133134512