LeetCode刷题day46

您所在的位置:网站首页 爱编程的大李子 LeetCode刷题day46

LeetCode刷题day46

2024-07-03 12:53| 来源: 网络整理| 查看: 265

文章目录 78. 子集题目描述思路分析参考代码 90. 子集 II题目描述思路分析参考代码 491. 递增子序列题目描述思路分析参考代码 46. 全排列题目描述思路分析参考代码 47. 全排列 II题目描述思路分析参考代码

78. 子集 题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

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

示例 2:

输入:nums = [0] 输出:[[],[0]] 思路分析

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下:

78.子集

回溯三部曲

确定递归参数和返回值

递归参数:需要遍历的数组 vector &nums,每层遍历的起始下标startIndex .

返回值:由于定义全局变量来保存最终结果集以及单一结果,所以并不需要返回值.

确定结束条件

由于这次是寻找所有的组合,所以并不需要结束条件.没递归一层就把对应的结果放入到结果集中.

确定单层递归逻辑

将当前组合数加入单一结果集,递归,回来后进行回溯.进行下一次循环.

参考代码 #include using namespace std; vector result; vector path; void backtracking(vector &nums,int startIndex){ result.push_back(path); for(int i = startIndex; i uset更新=>递归=>回溯=>循环下一个数. 如果不是,则进入跳过当前的数,进行下一个循环.

备注:因为 -100 = 2 的. } unordered_set uset;//用于去重 for(int i = startIndex; i 递归=>回溯=>循环下一个数

注意:used数组常用于组合中树层/树枝的去重(常伴随着元素先排序), 也常用于排列中数据的标记. ordered_set常用于进行树层去重.

参考代码 vector path; vector result; void backtracking(vector&nums,vector& used){//used用于取没有使用过的元素 if(path.size()==nums.size()){ result.push_back(path); return; } for(int i = 0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3