代码随想录 -- day29 -- 491.递增子序列、46.全排列、47.全排列 II

STM32--LoRa通信模块 模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。 阅读详情

 491.递增子序列

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

 回溯三部曲:

  • 确定递归函数和参数
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();
}

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

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;
    }
};

46.全排列

全排列就不用startIndex,直接从0开始

回溯三部曲:

  • 确定函数和参数
vector<vector<int>> result;
vector<int> path;
void backtracking (vector<int>& nums, vector<bool>& used)
  • 终止条件
// 此时说明找到了一组
if (path.size() == nums.size()) {
    result.push_back(path);
    return;
}
  •  单层遍历
for (int i = 0; i < nums.size(); i++) {
    if (used[i] == true) continue; // path里已经收录的元素,直接跳过
    used[i] = true;
    path.push_back(nums[i]);
    backtracking(nums, used);
    path.pop_back();
    used[i] = false;
}
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (used[i] == true) continue; // path里已经收录的元素,直接跳过
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            path.pop_back();
            used[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
}

47.全排列 II

 要强调的是去重一定要对元素进行排序,这样我们才方便通过相邻的节点来判断是否重复使用了

一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果。

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            // used[i - 1] == true,说明同一树枝nums[i - 1]使用过
            // used[i - 1] == false,说明同一树层nums[i - 1]使用过
            // 如果同一树层nums[i - 1]使用过则直接跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
                continue;
            }
            if (used[i] == false) {
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        result.clear();
        path.clear();
        sort(nums.begin(), nums.end()); // 排序
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄! 微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头: 拍摄身份证的正反面,自定义身份证取景框,在相机上绘制 “身份证轮廓“ 与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面 阅读详情

相关推荐

多GPU时代的虚拟内存革命:CUDA VMM API的跨设备协同设计哲学

本文深入探讨了NVIDIA CUDA VMM API在多GPU系统中的虚拟内存管理革命,解决了传统Peer Access的显存碎片化和同步开销问题。通过地址-内存解耦、按需映射和精细权限控制,VMM API为分布式训练提供了高效的内存协同方案,显著提升大模型训练性能。

weixin_29251337的博客 534

【代码随想录算法训练营Day29】 491.递增子序列;46.全排列;47.全排列 II

所以要从集合中判断当前数在前面的集合中有没有出现过,所以自然想到哈希表,规定:遇到相同的几个数,先固定第一个,再固定第二个。先固定数组中的一个值,然后再固定排列剩下的值。所以需要一个参数来表示数组中的数有没有被固定。这样做就需要给数组排个序使相同的数字挨在一起。

Tammy2001的博客 1019

基于HPM5E00的EtherCAT从站开发实战:从硬件解析到软件调试

实时工业以太网通信是工业自动化与运动控制领域的核心技术,它通过硬件与协议栈的协同,实现了微秒级的高确定性数据交换。其技术价值在于为多轴同步、机器人控制等复杂场景提供了高实时性、高同步精度的通信基础。在应用场景上,广泛服务于数控机床、包装机械、半导体设备等高端制造领域。本文聚焦于EtherCAT从站开发,深入解析了基于先楫HPM5E00高性能MCU与专用从站控制器(ESC)的硬件架构设计,并详细阐述了开源协议栈SOES的移植、对象字典配置以及过程数据(PDO)映射等核心软件实践,为开发者快速构建稳定可靠的实时

weixin_30915951的博客 501

代码随想录Day29 | 491.递增子序列、46.全排列、47.全排列II

491.递增子序列、46.全排列、47.全排列II

weixin_46620779的博客 1237

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4667

AI 实战篇 |基于 AI开放平台实现 人脸识别对比 功能,超详细教程【附带源码】

本篇文章来学习一下怎样使用 Unity实现简单地人脸识别 功能。 关于人脸识别,我们可以选择很多平台的SDK接入Unity来实现人脸识别的功能。

努力前行,总会成为自己心中的那道光 5万+

代码随想录刷题day29 491.递增子序列;46.全排列;47.全排列 II

代码随想录刷题day29

weixin_43127049的博客 494

关闭搜狗输入法右下角广告的解决方案

本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

代码随想录算法训练营day29 | 491.递增子序列、46.全排列、47.全排列 II

LeetCode | 491.递增子序列、46.全排列、47.全排列 II

weixin_69675605的博客 1190

备赛电赛学习硬件篇(六):复位电路工作原理

上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。

m0_61022809的博客 6771

Lammps纳米压痕接触面积—Matlab接触面积计算(两种方法)

Lammps纳米压痕接触面积计算

Rockyoung 5448

代码随想录算法训练营第day29|491.递增子序列、 46.全排列、 47.全排列 II

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。注意: 很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。

qq_60513199的博客 985

LPDDR6 Efficiency Mode 技术探讨

LPDDR6 Efficiency Mode 技术探讨

zilan23的博客 1159

代码随想录Day29 | 491.递增子序列 46.全排列 47.全排列 II

Day29

sRiddle的博客 563

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

零基础代码随想录【Day29】|| 491.递增子序列 ,46.全排列,47.全排列 II

本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。

Andrew______的博客 1037

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

代码随想录算法训练营day29 | 491.递增子序列,46.全排列,47.全排列 II

1、不能排序时,需要采用Map进行树层去重。同时,求子集可以省略终止条件。a、每层都是从0开始搜索而不是startIndex;b、需要记录path里都放了哪些元素了。3、47.全排列 II是46.全排列和40.组合总和II的结合。树枝不去重,树层去重。

2301_77450803的博客 752

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

代码随想录day29 491.递增子序列 46.全排列 47.全排列II

全排列,递增子序列

weixin_55496975的博客 268

Day29代码随想录回溯part05:491.递增子序列、46.全排列、47.全排列 II

题目难度性不大,就是要记录不能重复使用(需要used数组记录path里都放了哪些元素了),同时是每一次都从第一位开始遍历的(每层都是从0开始搜索而不是startIndex)而本题求自增子序列,**是不能对原数组进行排序的,**排完序的数组都是自增子序列了。:给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。题意:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。**题意:**给定一个 没有重复 数字的序列,返回其所有可能的全排列。

Estrellazhu的博客 460

代码随想录day29|491.递增子序列|46.全排列|47.全排列 II|Golang

笔记

weixin_42161901的博客 621

代码随想录算法训练营day29|491.递增子序列、46.全排列、47.全排列II

非递减子序列,则答案的子集中,需保持下一个元素大于等于前一个元素的顺序,由于题目中指出,所有的子序列长度需大于等于2,考虑当条件为path.size()>1时,进行收获结果,且需要注意,这时不应该直接return,因为后续仍有可能存在子序列长度大于2的结果,仍需要继续遍历。此时结束的标志是单层遍历的结束。

github_35852648的博客 956

代码随想录算法营DAY29 | 491.递增子序列 46.全排列 47.全排列 II

代码随想录算法营DAY29 | 491.递增子序列 46.全排列 47.全排列 II

chizi62的博客 247

代码随想录【Day29】|491. 递增子序列、46. 全排列、47. 全排列 II

回溯,子集问题、排列问题 去重的技巧很关键!

傅里叶变不出的博客 301

代码随想录二刷day29 | 回溯之 491.递增子序列 46.全排列 47.全排列 II

回溯之 491.递增子序列 46.全排列 47.全排列 II

baimaozi_007的博客 342

代码随想录训练营Day29|491.递增子序列46.全排列47.全排列 II

491. 递增子序列 - 力扣(LeetCode)47. 全排列 II - 力扣(LeetCode)46. 全排列 - 力扣(LeetCode)

weixin_44174445的博客 212

代码随想录算法训练营Day29 | 491.递增子序列 46.全排列 47.全排列 II

思路:1.path.size()>1收集结果;2.去重,在同一层不能有重复元素。3.判断当前元素是否大于等于path的最后元素。

qq_24817679的博客 531

代码随想录刷题Day29 | 491.递增子序列 | 46.全排列 | 47.全排列 II

代码随想录刷题Day29 | 491.递增子序列 | 46.全排列 | 47.全排列 II

DUM1615的博客 298
上一篇: 代码随想录 -- day28 -- 93.复原IP地址 、78.子集 、90.子集II
下一篇: 代码随想录 -- day30 -- 332.重新安排行程 、51. N皇后、37. 解数独
七人酒
博客等级 码龄4年 51粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值