代码随想录第28天|回溯算法

491. 非递减子序列

在这里插入图片描述
思路:

  • 不可以排序, 否则会改变元素的顺序
  • 对收获的结果有要求, num.size() >= 2, 且 num[i - 1] < num[i]
  • 需要进行去重, 不能使用排序后的方法去重
  • 每一层可用 unordered_set 去重
  • 组合问题, for 遍历需要标记起始位置

bug:

  • 一定要先判断元素是否重复, 再将元素插入
    请添加图片描述
//正确步骤
if (used.find(nums[i]) != used.end()) {
    continue;
} else if (res_tem.empty()) { // 重复元素
    res_tem.push_back(nums[i]);
} else if (res_tem.back() > nums[i]) { // 非递增
    continue;
} else {
    res_tem.push_back(nums[i]);
}

//错误步骤
//当res_tem为空时, 会将重复元素也添加, 一定需要先判断元素是否有使用
if (res_tem.size() == 0) { 
    res_tem.push_back(nums[i]);
} else if (used.find(nums[i]) != used.end()) { //重复元素
    continue;
} else if (!(res_tem.back() <= nums[i])) {  //非递增
    continue;
} else {
    res_tem.push_back(nums[i]);
}
class Solution {
public:
    vector<vector<int>> res;
    vector<int> res_tem;
    void myoperator(vector<int>& nums, int index) {
        if (res_tem.size() >= 2) {
            res.push_back(res_tem);
        }
        unordered_set<int> used;
        for (int i = index; i < nums.size(); i++) {
            
            if (used.find(nums[i]) != used.end()) {
                continue;
            } else if (res_tem.empty()) { // 重复元素
                res_tem.push_back(nums[i]);
            } else if (res_tem.back() > nums[i]) { // 非递增
                continue;
            } else {
                res_tem.push_back(nums[i]);
            }
			// 等效操作
            // if (!res_tem.empty() && nums[i] < res_tem.back()) {
            //     continue;
            // }
            // if (used.find(nums[i]) != used.end()) {
            //     continue;
            // }
            // res_tem.push_back(nums[i]);

            used.insert(nums[i]);
            myoperator(nums, i + 1);
            res_tem.pop_back();
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        myoperator(nums, 0);
        return res;
    }
};

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
在这里插入图片描述
思路:

  • 不能使用index来跳过元素, 因为与顺序有关, 所以遍历从 i = 0 开始
  • 每个元素都要遍历, 可以使用 used 数组去重
  • 无法用 unordered_set 去重, 每层树枝都有相互关联, 不是去除重复数字操作

请添加图片描述

class Solution {
public:
    vector<vector<int>> res;
    vector<int> res_tem;
    vector<bool> uesed;
    void myoperator(vector<int>& nums) {
        if (res_tem.size() == nums.size()) {
            res.push_back(res_tem);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if (uesed[i] == true) {
                continue;
            }
            uesed[i] = true;
            res_tem.push_back(nums[i]);
            myoperator(nums);
            uesed[i] = false;
            res_tem.pop_back();
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        uesed = vector<bool>(nums.size(), 0);
        myoperator(nums);
        return res;
    }
};

47. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列
在这里插入图片描述
请添加图片描述
思路:

  • 取叶子节点, 中间需要去除, 相同数层之间不能用同样的数值
  • 排列则需要从0开始, 使用used标记使用过的元素
class Solution {
public:
    vector<vector<int>> res;
    vector<int> res_tem;
    vector<bool> flag;
    void myoperator(vector<int>& nums) {
        if (res_tem.size() == nums.size()) {
            res.push_back(res_tem);
            return;
        }
        unordered_set<int> used;
        for (int i = 0; i < nums.size(); i++) {
            if (used.find(nums[i]) != used.end()) {
                continue;
            }
            if (flag[i] == true) {
                continue;
            }
            flag[i] = true;
            used.insert(nums[i]);
            res_tem.push_back(nums[i]);
            myoperator(nums);
            flag[i] = false;
            res_tem.pop_back();
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        flag = vector<bool>(nums.size(), false);
        myoperator(nums);
        return res;
    }
};

51. N 皇后
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
在这里插入图片描述
参考
请添加图片描述


37. 解数独
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考
请添加图片描述

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

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

相关文章

【干货】什么是客户裂变系统?它如何帮助saas企业实现业绩转化?

在数字化时代&#xff0c;客户裂变系统已成为SaaS企业实现业绩转化的重要工具。简而言之&#xff0c;客户裂变系统是一种通过现有客户吸引更多新客户的策略。 什么是客户裂变系统&#xff1f; 该系统基于用户行为和数据分析&#xff0c;通过精心设计的激励机制&#xff0c;如…

王思聪隐形女儿曝光

王思聪"隐形"女儿曝光&#xff01;黄一鸣独自面对怀孕风波&#xff0c;坚持生下爱情结晶近日&#xff0c;娱乐圈掀起了一场惊天波澜&#xff01;前王思聪绯闻女友黄一鸣在接受专访时&#xff0c;大胆揭露了她与王思聪之间的爱恨纠葛&#xff0c;并首度公开承认&#…

Suno AI如何解决制作多语言混合的歌曲~

导读 你想不想制作一首有中文和粤语混合的歌曲&#xff1f; 你想不想制作一首有中文和日语混合的歌曲&#xff1f; 你想不想制作一首有中文和英语混合的歌曲&#xff1f; 如果你想不知道怎么操作&#xff0c;可以阅读下本文。 说明 本文让AI唱一首中文和日语混合的歌曲&am…

OpenCV中的圆形标靶检测——findCirclesGrid()(三)

前面说到cv::findCirclesGrid2()内部先使用SimpleBlobDetector进行圆斑检测,然后使用CirclesGridClusterFinder算法类执行基于层次聚类的标靶检测。如下图所示,由于噪声的影响,SimpleBlobDetector检出的标靶可能包含噪声。 而CirclesGridClusterFinder算法类会执行基…

【CT】LeetCode手撕—手撕快排

目录 题目1-思路-快排1-1 快排的核心思想快速排序算法步骤优美的调整区间 1-2 ⭐快排的实现 2- 实现⭐912. 排序数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;912. 排序数组 1-思路-快排 1-1 快排的核心思想 选择一个基准 基准左侧的元素都小于该元素基准右侧的元…

数据分析必备:一步步教你如何用matplotlib做数据可视化(6)

1、Matplotlib 网格 axes对象的grid()函数将图中网格的可见性设置为on或off。还可以显示网格的主要/次要(或两者)刻度。另外&#xff0c;可以在grid()函数中设置color&#xff0c;linestyle和linewidth属性。 参考以下示例代码 import matplotlib.pyplot as plt import numpy…

GLib库内存块数据类型简单用法

代码; #include <glib.h> int main() {GMemChunk *chunk; // 定义内存块gchar *mem[10]; // 定义指向原子的指针数组gint i, j;chunk g_mem_chunk_new( // 创建内存块"Test MemChunk", // 名称5, // 原子的长度50, …

在3dmax软件中如何快速创建毛发?---模大狮模型网

在3D建模和渲染中&#xff0c;为角色或物体添加逼真的毛发效果是提升场景真实感的重要步骤之一。然而&#xff0c;手动一根一根创建毛发是非常繁琐的&#xff0c;因此掌握如何在软件中快速生成和调整毛发效果至关重要。模大狮将详细介绍如何利用3ds Max 2018创建毛发&#xff0…

上市公司-社会责任报告、ESG报告文本(2006-2023年)

上市公司社会责任报告是企业对外公布的一份关于其社会责任实践和成果的详细文件&#xff0c;涵盖环境保护、社会贡献和公司治理等方面的表现。通常包含公司在减少环境影响、提升社会福祉、维护员工权益、促进社区发展以及确保透明和道德的管理实践等方面的信息和数据。有助于了…

宠物空气净化器爆火的背后...小米、希喂、安德迈性能大揭秘?

广东省 猫友们都清楚&#xff0c;猫咪虽然魅力无穷&#xff0c;但它们掉毛的问题确实令人头疼。家具、衣物上、空气中都散布着猫浮毛&#xff0c;给铲屎官造成困扰。其中最难处理的便是空气中的浮毛啦&#xff0c;如果不及时处理会对家庭成员造成健康威胁。接下来&#xff0c;我…

MySQL8,Navicat能登陆成功,密码却忘记了

执行成功的图&#xff1a; 以下为步骤&#xff1a;本文一共8个简单步骤。 环境&#xff1a;mysql8、window10、navicat11 1、打开本地电脑window10的命令窗&#xff08;俗称黑窗口&#xff09;&#xff0c;windowR 2、输入regegit&#xff0c;回车&#xff0c;打开注册表 3、…

判断单链表是否带环且返回节点

今天鄙人为大家带来的是一道简单的逻辑运算题。用用到了一个我们在链表中提及过的方法快慢法。这道题其实没啥考的实际意义。只是我们如果能了解这道题的解决方法的话。对我们后面梳理逻辑会有很大的帮助。 单链表的题目 我们可以看到上面的题目。就是让我们判断是否带环。也许…

深入了解 Android 中的 ViewStub

在 Android 开发中&#xff0c;性能优化一直是一个重要的话题。ViewStub 作为一种轻量级视图容器&#xff0c;可以帮助我们在合适的时机延迟加载视图&#xff0c;从而优化应用性能。本文将详细介绍 ViewStub 的概念、使用方法以及在实际开发中的应用场景。 什么是 ViewStub&am…

船舶行业信息安全解决方案介绍

船舶行业信息安全背景&#xff1a; 近年来随着经济复苏、疫情与国际形势影响国内外船舶海运业务蓬勃发展&#xff0c;在业务量激增的背景下出现多类信息安全事件。其中2017年&#xff0c;马士基集团遭到勒索软件攻击&#xff0c;内部业务系统和码头操作系统均受到严重影响&…

【计算机视觉(11)】

基于Python的OpenCV基础入门——图像梯度变换 图像梯度变换Sobel算子Scharr算子Laplacian算子 图像梯度变换的代码实现以及效果图 图像梯度变换 图像梯度变换可以用于边缘检测、特征提取、增强图像和压缩图像等多种任务。图图像梯度可以把图像看成二维离散函数&#xff0c;图像…

深入二进制安全:全面解析Protobuf

前言 近两年&#xff0c;Protobuf结构体与Pwn结合的题目越来越多。 23年和24年Ciscn都出现了Protobuf题目&#xff0c;24年甚至还出现了2道。 与常规的Pwn题利用相比&#xff0c;只是多套了一层Protobuf的Unpack操作。 本文包含Protobuf环境安装、相关语法、编译运行以及pb…

【吊打面试官系列-Mysql面试题】Myql 中的事务回滚机制概述 ?

大家好&#xff0c;我是锋哥。今天分享关于 【Myql 中的事务回滚机制概述 ?】面试题&#xff0c;希望对大家有帮助&#xff1b; Myql 中的事务回滚机制概述 ? 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位…

keil MDK自动生成带版本bin文件

作为嵌入式单片机开发&#xff0c;在Keil MDK&#xff08;Microcontroller Development Kit&#xff09;中开发完编译完后&#xff0c;经常需要手动进行版本号添加用于发版&#xff0c;非常麻烦&#xff0c;如果是对外发行的话&#xff0c;更容易搞错&#xff0c;特此码哥提供一…

汉化版PSAI全面测评,探索国产AI绘画软件的创新力量

引言 随着AI技术的飞速发展&#xff0c;图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主&#xff0c;今天我们测评的是一款国产AI绘画软件——StartAI&#xff0c;一句话总结&#xff1a;它不仅在技术上毫不逊色于国际大牌&#xff0c;更在用户体验和本地化服务上做到…