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

递增子序列

491. 非递减子序列 - 力扣(LeetCode)

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

        如果只按照上述向下运行,没有完成子序列的去重操作,为了完成子序列的去重以及保证下一个元素大于当前元素才加入数组,考虑加入一个set,在对当前层进行遍历时,若该元素没有使用过,将其加入set,若该元素大于path的末尾元素,将其加入path。之后继续回溯,回溯完成后复原path。具体思路参考代码随想录。

代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

class Solution {
public:
    vector<int> path; // 存储当前递增子序列
    vector<vector<int>> paths; // 存储所有不同的递增子序列
    void backtracking(vector<int>& nums, int start) {
        if (path.size() >= 2) {
            paths.push_back(path); // 将满足条件的子序列添加到结果中
        }
        unordered_set<int> uset; // 用于去重
        for (int i = start; 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(); // 回溯,移除当前元素
        }
    }

    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums, 0); // 从第一个元素开始搜索
        return paths;
    }
};

回溯法寻找递增子序列的过程,在最差情况下需要遍历所有可能的子序列,每个元素都有可能存在或者不存在与子序列中,所以算法的时间复杂度为O(2^n),就空间复杂度来说,使用了哈希集合来检查是否已经包含了某个元素,使用了一个辅助的path来存储当前的子序列,在递归的过程中,path和uset都会不断改变,但最大的情况为递归的最深处,此时应有n层,因此空间复杂度为O(n)。

全排列

46. 全排列 - 力扣(LeetCode)

思路:从数组的第一个元素开始,逐步构建排列,对于每个位置,将不同的数字放在该位置上,然后递归地处理下一个位置。若当前位置已经包含了某元素,则我们要跳过它,选择其他数字,条件为

 if (find(path.begin(), path.end(), nums[i]) == path.end()) 

治理find函数返回的迭代器等于path.end(),说明nums[i]不在path中,即当前数字还没有被使用过。

当排列的长度等于数组的长度时,收获为一个有效的排列。

if (path.size() == nums.size()) {
            result.push_back(path); // 当排列长度等于数组长度时,保存该排列
            return;
        }

整体代码如下。

class Solution {
public:
    vector<int> path; // 保存当前排列
    vector<vector<int>> result; // 保存所有不同的排列

    void backtracking(vector<int>& nums, int start) {
        if (path.size() == nums.size()) {
            result.push_back(path); // 当排列长度等于数组长度时,保存该排列
            return;
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (find(path.begin(), path.end(), nums[i]) == path.end()) {
                // 如果当前数字不在排列中,将其添加到排列中
                path.push_back(nums[i]);
                backtracking(nums, i + 1); // 递归搜索下一个位置
                path.pop_back(); // 回溯,移除当前数字
            }
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        backtracking(nums, 0); // 从第一个位置开始搜索
        return result;
    }
};

排列的时间复杂度为O(n!),每个位置,都可以选择不同的数字。

空间复杂度为O(n)。

全排列II

47. 全排列 II - 力扣(LeetCode)

错误代码,使用了start

class Solution {
public:
    vector<int> path; // 保存当前排列
    vector<vector<int>> result; // 保存所有不同的排列
    void backtracking(vector<int>& nums, int start) {
        if (path.size() == nums.size()) {
            result.push_back(path); // 当排列长度等于数组长度时,保存该排列
            return;
        }
        for (int i = 0; i < nums.size(); ++i) {
            if(start > 0 and nums[i]== nums[i - 1]){
                continue;
            }
                path.push_back(nums[i]);
                backtracking(nums, i + 1); // 递归搜索下一个位置
                path.pop_back(); // 回溯,移除当前数字
            }
        }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end()); // 首先排序,以便去除重复排列
        backtracking(nums, 0);
        return result;
    }
};

正确代码

class Solution {
public:
    vector<int> path; // 保存当前排列
    vector<vector<int>> result; // 保存所有不同的排列

    void backtracking(vector<int>& nums, vector<bool>& used, int start) {
        if (path.size() == nums.size()) {
            result.push_back(path); // 当排列长度等于数组长度时,保存它
            return;
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
                continue; // 跳过重复的元素
            }
            if (!used[i]) {
                path.push_back(nums[i]);
                used[i] = true;
                backtracking(nums, used, i + 1); // 递归搜索下一个位置
                path.pop_back(); // 回溯,移除当前数字
                used[i] = false;
            }
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end()); // 首先排序,以便去除重复排列
        vector<bool> used(nums.size(), false); // 初始化 used 数组
        backtracking(nums, used, 0);
        return result;
    }
};

start可有可无

算法的时间复杂度为O(n!),空间复杂度为O(n),同上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatTTS 保姆级教程从入门到精通

ChatTTS 保姆级教程从入门到精通 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能…

DP动态规划(上)

文章目录 动态规划基本概念斐波那契数列问题C 实现Python 实现Java 实现 迷你结C、Python和Java在实现动态规划时有哪些性能差异&#xff1f;迷你结哪种语言在动态规划中更适合大规模数据处理?迷你结C有哪些知名的库适用于动态规划和大数据处理?动态规划辅助库大数据处理库 迷…

React中常见的面试题

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! 1. 约束性组件与非约束性组件 1.1. 非约束性组件 非约束性组件其实就是不能控制状态的组件,比如: <input type"text" defaultValue"123&qu…

JVM之【字节码/Class文件/ClassFile 内容解析】

说在前面的话 Java语言:跨平台的语言(write once,run anywhere) 当Java源代码成功编译成字节码后&#xff0c;如果想在不同的平台上面运行&#xff0c;则无须再次编译这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp等有强大的解释器。跨平台似乎已经快成为一门语言…

力扣hot100:138. 随机链表的复制(技巧,数据结构)

LeetCode&#xff1a;138. 随机链表的复制 这是一个经典的数据结构题&#xff0c;当做数据结构来学习。 1、哈希映射 需要注意的是&#xff0c;指针也能够当做unordered_map的键值&#xff0c;指针实际上是一个地址值&#xff0c;在unordered_map中&#xff0c;使用指针的实…

C++--DAY3

思维导图 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std; class …

小孩天赋是怎样炼成的 懂孩子比爱孩子更重要 详细天赋评估列表 观察非常细致 培养领导能力的方法

懂孩子比爱孩子更重要 “懂孩子比爱孩子更重要&#xff0c;懂才更准确的去爱” 这句话说得很有道理。理解孩子的内心世界、需求和独特个性&#xff0c;比单纯地给予爱更加重要。以下是一些解释&#xff1a; 理解孩子的需要&#xff1a;懂孩子意味着理解他们的需求、恐惧、欢乐…

SVN安装详细教程

&#x1f4d6;SVN安装详细教程 ✅1. 下载✅2. 安装✅3. 使用 ✅1. 下载 官方地址&#xff1a;https://tortoisesvn.net/downloads.html 123云盘地址&#xff1a;https://www.123pan.com/s/4brbVv-rsoWA.html ✅2. 安装 双击TortoiseSVN-1.14.6.29673-x64-svn-1.14.3.msi安装…

【微信小程序】模板语法

数据绑定 对应页面的 js 文件中 定义数据到 data 中&#xff1a; 在页面中使用 {{}} 语法直接使用&#xff1a; 事件绑定 事件触发 常用事件&#xff1a; 事件对象的属性列表&#xff08;事件回调触发&#xff0c;会收到一个事件对象 event&#xff0c;它的详细属性如下&…

智慧医疗新纪元:可视化医保管理引领未来

在数字化浪潮席卷全球的今天&#xff0c;我们的生活正在经历前所未有的变革。其中&#xff0c;智慧医保可视化管理系统就像一股清新的风&#xff0c;为医疗保障领域带来了全新的活力与可能。 想象一下&#xff0c;在繁忙的医院里&#xff0c;患者和家属不再需要为了查询医保信息…

GPT-4 Turbo 和 GPT-4 的区别

引言 人工智能&#xff08;AI&#xff09;领域的发展日新月异&#xff0c;OpenAI 的 GPT 系列模型一直是这一领域的佼佼者。GPT-4 和 GPT-4 Turbo 是目前市场上最先进的语言模型之一。本文将详细探讨 GPT-4 和 GPT-4 Turbo 之间的区别&#xff0c;以帮助用户更好地理解和选择适…

NSIS 安装包默认支持的参数

NSIS 安装包默认支持的参数 NSIS 制作的安装包默认支持 /NCRC、/S、/D 三个参数&#xff0c;详见下文 3.2 Installer Usage&#xff08;来自 Command Line Usage&#xff09;。 以上三个参数对应的功能分别为禁止 CRC 校验、静默安装、设置安装路径&#xff0c;这三个功能不需…

数据资产入表-数据治理-标签设计标准

前情提要&#xff1a;数据价值管理是指通过一系列管理策略和技术手段&#xff0c;帮助企业把庞大的、无序的、低价值的数据资源转变为高价值密度的数据资产的过程&#xff0c;即数据治理和价值变现。上一讲介绍了数据清洗标准设计的基本逻辑和思路。 上一讲介绍了其他的通用标…

PyTorch 相关知识介绍

一、PyTorch和TensorFlow 1、PyTorch PyTorch是由Facebook开发的开源深度学习框架&#xff0c;它在动态图和易用性方面表现出色。它以Python为基础&#xff0c;并提供了丰富的工具和接口&#xff0c;使得构建和训练神经网络变得简单快捷。 发展历史和背景 PyTorch 是由 Fac…

几何裁剪技术在AI去衣应用中的革新作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理领域的应用也日益广泛。特别是在AI去衣技术中&#xff0c;几何裁剪技术扮演着至关重要的角色。本文将深入探讨几何裁剪技术在AI去衣中的应用及其带来的影响。 一、几何裁剪技术概述 几何裁剪技术是一种基…

【python】python租房数据分析可视化(源码+数据+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

completefuture造成的rpc重试事故

前言 最近经历了一个由于 completefuture 的使用&#xff0c;导致RPC重试机制触发而引起的重复写入异常的生产bug。复盘下来&#xff0c;并非是错误的使用了completefuture&#xff0c;而是一些开发时很难意识到的坑。 背景 用户反馈通过应用A使用ota批量升级设备时存在概率…

北航数据结构与程序设计第四次作业选填题复习

首先都是线性的&#xff0c;线性包括顺序和链式&#xff0c;栈和队都可以用两种方式实现。栈只能存于栈顶取于栈顶&#xff0c;队列先进先出&#xff0c;因此存取点是固定的。 函数栈帧创建原理 画图即可。 A.显然不行&#xff0c;5如果第一个出来说明5是最后一个进的&#xf…

收银系统源码-千呼新零售2.0【合作案例】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

解锁下载EasyRecovery2024电脑版软件 3步破解下载秘籍!

在数字时代&#xff0c;数据已成为我们生活中不可或缺的一部分。无论是工作中的重要文件&#xff0c;还是珍贵的家庭照片和视频&#xff0c;数据都承载着我们的回忆和努力。然而&#xff0c;数据的丢失也是我们常常遇到的问题。硬盘损坏、误删除、病毒攻击等都可能导致数据丢失…