递增子序列

news/2024/11/24 10:51:41/

1题目

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:

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

提示:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

2链接

题目链接:491. 递增子序列 - 力扣(LeetCode)

视频链接:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili

3解题思路

在90.子集II (opens new window)中我们是通过排序,再加一个标记数组来达到去重的目的。

而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。

所以不能使用之前的去重逻辑!

以[4, 7, 6, 7]这个数组来举例,抽象为树形结构如图:

回溯三部曲:

1、确定函数参数及返回值

本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。

vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& nums, int startIndex)

2、确定终止条件

本题收集结果有所不同,题目要求递增子序列大小至少为2。

因为递增序列嘛,不可能是一个。只要大于等于2且没被剪枝的都要收集起来

if (path.size() > 1) {result.push_back(path);// 注意这里不要加return,因为要取树上的所有节点
}

3、确定单层递归逻辑

在图中可以看出,同一父节点下的同层上使用过的元素就不能再使用了

这里选择使用unordered_set去重,局部变量,仅记录本层的内容。

unordered_set<int> uset; // 使用set来对本层元素进行去重
for (int i = startIndex; i < nums.size(); i++) {if ((!path.empty() && nums[i] < path.back())|| uset.find(nums[i]) != uset.end()) {continue;}uset.insert(nums[i]); // 记录这个元素在本层用过了,本层后面不能再用了path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();
}

unordered_set<int> uset; 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!所以不需要pop()

4代码

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {if (path.size() > 1) {result.push_back(path);// 注意这里不要加return,要取树上的节点}unordered_set<int> uset; // 使用set对本层元素进行去重for (int i = startIndex; i < nums.size(); i++) {if ((!path.empty() && nums[i] < path.back())|| uset.find(nums[i]) != uset.end()) {continue;}uset.insert(nums[i]); // 记录这个元素在本层用过了,本层后面不能再用了path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};


http://www.ppmy.cn/news/221562.html

相关文章

华为手机双卡有android,华为今后再无双卡双通手机 Mate 8成绝唱

华为今后再无双卡双通手机 Mate 8成绝唱 来源&#xff1a;www.18183.com作者&#xff1a;似水流年时间&#xff1a;2016-11-24 不知道到家发现了没有&#xff0c;新款的华为mate9并没有双卡双待的功能了&#xff0c;本文小编为您带来华为今后再无双卡双通手机 Mate 8成绝唱。 不…

配置docker阿里云镜像加速

默认情况下docker安装镜像文件是从docker官方的镜像中心下载&#xff1a;https://hub.docker.com/ &#xff0c; 有时速度慢&#xff0c;可以通过配置docker阿里云镜像来加速&#xff0c;配置后&#xff0c;就从国内阿里云下载。 注册阿里云用户&#xff0c;登录->工作台-&g…

华为p9 android版本,华为P9的手机系统是什么

华为P9的手机系统是什么 华为P9的手机系统是Android 6.0。 摄像头方面&#xff0c;P9搭配双1200万像素后置镜头&#xff0c;f1.9大光圈(能拍摄更好焦外虚化效果)&#xff0c;以及前置800万像素镜头;其中后置镜头拥有双光学传感器(两个传感器分别负责色彩和锐速以及画面细节&…

华为手机双卡有android,安卓卡慢?余承东:国内或只有华为能解决

北京时间11月15日消息&#xff0c;昨日下午华为正式发布了国行版Mate 9。相比以往&#xff0c;宣传手机性能多强不同&#xff0c;这次华为宣城市&#xff0c;解决了Android一个长久以来心病——“越用越慢”。对此华为消费者业务CEO余承东在接受采访时表示&#xff0c;安卓手机…

华为nova9和nova9pro参数配置

华为nova9Pro&#xff1a; 搭载6.72英寸的OLED屏幕&#xff0c;带来 120Hz的屏幕刷新 &#xff0c;带来FHD分辨率&#xff0c;带来 300Hz的屏幕触控采样 华为nova9pro新品活动388红包等你抢 机会不容错过 http://huawei.adiannao.cn/7 华为nova9&#xff1a; 搭载6.57英寸的OLE…

华为手机双卡有android,华为Mate 40系列手机入网:双卡5G+安卓系统

华为Mate 40系列手机是最近大家都比较关注的&#xff0c;而该系列手机的消息不断的被曝光&#xff0c;但是具体的发布时间一直没有确定&#xff0c;相关配置和外观均得到了曝光&#xff0c;不过最新的消息显示&#xff0c;华为Mate 40系列手机已经在工信部入网了&#xff0c;请…

华为为什么显示未插卡_华为mate20为什么显示未插卡

你好 可能是机器本身的sim卡槽松动 或者是卡没插好 摇晃或者碰撞时导致接触不好建议把sim取下来重新插下试试希望能帮到你 谢谢www.51dongshi.com防采集。 SIM卡就是我们平时常说的电话卡,也称为手机用户身份识别卡,不知道大家有没有经历过 明明SIM卡在卡槽里放得好好的,却突…

华为平板 鸿蒙2.0,华为鸿蒙2.0支持型号有哪些

关于华为鸿蒙系统2.0的升级&#xff0c;相信很多小伙伴对此都非常感兴趣&#xff0c;那么具体有哪些型号可以进行升级呢?关于这个小编已经帮大家准备好了相关内容&#xff0c;希望可以帮助到大家&#xff0c;快来和小编一起来看看吧。 鸿蒙2.0Beta 测试支持以下手机及平板电脑…