算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三(leetcode真题剖析)

在这里插入图片描述

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三

  • 01.字母大小写全排列
  • 02.优美的排列
  • 03.N 皇后
  • 04.有效的数独

01.字母大小写全排列

题目链接:https://leetcode.cn/problems/letter-case-permutation/

给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。

返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。

示例 1:

输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]

示例 2:

输入: s = "3z4"
输出: ["3z4","3Z4"]

提示:

  • 1 <= s.length <= 12
  • s 由小写英文字母、大写英文字母和数字组成

思路

在处理英文字母时,每个元素存在三种情况:

  1. 不进行处理;
  2. 如果当前字母是英文字母并且是大写,将其修改为小写;
  3. 如果当前字母是英文字母并且是小写,将其修改为大写。

代码

class Solution {
    string path;
    vector<string> ret;
public:
    vector<string> letterCasePermutation(string s) {
        dfs(s,0);
        return ret;
    }

    void dfs(string& s,int pos){
        if(pos==s.size()){
            ret.push_back(path);
            return;
        }

        int ch=s[pos];
        path.push_back(ch);
        dfs(s,pos+1);
        path.pop_back();

        if(ch<'0'||ch>'9'){
            int tmp=change(ch);
            path.push_back(tmp);
            dfs(s,pos+1);
            path.pop_back();
        }
    }

    char change(char ch){
        if(ch>='a'&&ch<='z') ch-=32;
        else ch+=32;
        return ch;
    }
};

02.优美的排列

题目链接:https://leetcode.cn/problems/beautiful-arrangement/

假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列

  • perm[i] 能够被 i 整除
  • i 能够被 perm[i] 整除

给你一个整数 n ,返回可以构造的 优美排列数量

示例 1:

输入:n = 2
输出:2
解释:
第 1 个优美的排列是 [1,2]:
    - perm[1] = 1 能被 i = 1 整除
    - perm[2] = 2 能被 i = 2 整除
第 2 个优美的排列是 [2,1]:
    - perm[1] = 2 能被 i = 1 整除
    - i = 2 能被 perm[2] = 1 整除

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 15

思路
在这个问题中,我们需要在每一个位置上考虑所有的可能情况,并确保不出现重复。通过深度优先搜索的方式,不断地枚举每个数在当前位置的可能性,并回溯到上一个状态,直到枚举完所有可能性,得到正确的结果。为了实现这一目标,可以采用以下步骤:

  1. 定义一个变量用来记录所有可能的排列数量;
  2. 使用一个一维数组 visited 标记元素的使用情况;
  3. 从第一个位置开始进行递归,枚举每个数的可能性。

通过这样的深度优先搜索过程,可以得到所有符合条件的排列。

代码

class Solution {
    bool check[16];
    int ret=0,n;
public:
    int countArrangement(int _n) {
        n=_n;
        dfs(1);
        return ret;
    }

    void dfs(int pos){
        if(pos==n+1){
            ret++;
            return;
        }

        for(int i=1;i<=n;++i){
            if(!check[i]&&(pos%i==0||i%pos==0)){
                check[i]=true;
                dfs(pos+1);
                check[i]=false;
            }
        }
    }
};

03.N 皇后

题目链接:https://leetcode.cn/problems/n-queens/

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

思路

首先,在每一行放置第一个皇后,然后遍历棋盘的第二行,在可行的位置放置第二个皇后,再遍历第三行,以此类推,直到放置了n个皇后为止。

为了记录每一行放置的皇后的列数,使用一个数组来记录。在每一行中,尝试放置一个皇后,并检查是否与前面已经放置的皇后冲突。如果没有冲突,继续递归地放置下一行的皇后,直到所有皇后都放置完毕,然后记录这个方案。

在检查皇后是否冲突时,可以使用一个数组来记录每一列是否已经放置了皇后,并检查当前要放置的皇后是否会和已经放置的皇后冲突。对于对角线,可以使用两个数组来记录从左上角到右下角的每一条对角线上是否已经放置了皇后,以及从右上角到左下角的每一条对角线上是否已经放置了皇后。

对于对角线是否冲突的判断可以通过以下流程解决:

  1. 从左上到右下:相同对角线的行列之差相同;
  2. 从右上到左下:相同对角线的行列之和相同。

因此,需要创建用于存储解决方案的二维字符串数组 ret,用于存储每个皇后的位置的一维整数数组 path,以及用于记录每一列和对角线上是否已经有皇后的布尔型数组 checkColcheckDig1checkDig2

代码

class Solution {
    bool checkCol[10],checkDig1[20],checkDig2[20];
    vector<vector<string>> ret;
    vector<string> path;
    int n;
public:
    vector<vector<string>> solveNQueens(int _n) {
        n=_n;
        path.resize(n,string(n,'.'));
        dfs(0);
        return ret;
    }

    void dfs(int row){
        if(row==n){
            ret.push_back(path);
            return;
        }

        for(int col=0;col<n;++col){
            if(!checkCol[col]&&!checkDig1[row-col+n]&&!checkDig2[row+col]){
                path[row][col]='Q';
                checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col]=true;
                dfs(row+1);
                path[row][col]='.';
                checkCol[col]=checkDig1[row-col+n]=checkDig2[row+col]=false;
            }
        }
    }
};

04.有效的数独

题目链接:https://leetcode.cn/problems/valid-sudoku/

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

注意:

  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 空白格用 '.' 表示。

示例 1:

输入:board = 
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true

示例 2:

输入:board = 
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:false
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。

思路

创建三个数组标记行、列以及 3*3 小方格中是否出现 1~9 之间的数字即可。

代码

class Solution {
    int row[9][10];
    int col[9][10];
    int grid[3][3][10];
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                if(board[i][j]!='.'){
                    int num=board[i][j]-'0';
                    if(!row[i][num]&&!col[j][num]&&!grid[i/3][j/3][num]){
                        row[i][num]=col[j][num]=grid[i/3][j/3][num]=1;
                    }else return false;
                }
            }
        }
        return true;
    }
};

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

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

相关文章

Walmart 砸23亿美元收购 Vizio | 百能云芯

美国零售巨头沃尔玛&#xff08;Walmart&#xff09;宣布以 23 亿美元的价格收购智能电视品牌 Vizio&#xff0c;该举措旨在加速其广告业务 Walmart Connect 的增长。市场研究机构 TrendForce 看好此收购案&#xff0c;认为这有助于 Vizio 挑战三星的地位&#xff0c;成为美国第…

如何在Linux搭建Inis网站,并发布至公网实现远程访问【内网穿透】

如何在Linux搭建Inis网站&#xff0c;并发布至公网实现远程访问【内网穿透】 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.…

苹果iPad通过Code APP应用实现SSH连接服务器远程进行开发

文章目录 1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 本文主要介绍开源iPad应用IDE Code App 如何下载安装&#xff0c;并…

「C#」WPF学习笔记-基础类及继承关系

1、DependencyObject DependencyObject是WPF中依赖属性系统的核心&#xff0c;它为WPF的数据绑定、动画和属性共享等功能提供了支持&#xff0c;是一个非常重要的基类。 其主要特点和职责包括&#xff1a; 依赖属性系统&#xff1a;DependencyObject 是所有支持依赖属性的类…

从中序与后序遍历序列构造二叉树

1.题目 这道题是2024-2-21的签到题&#xff0c;题目难度为中等。 考察知识点为递归。 题目链接&#xff1a;从中序与后序遍历序列构造二叉树 给定两个整数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历…

(12)ATF BL31中断

欢迎关注“安全有理”微信公众号。 概述 系统在运行过程中的任何阶段&#xff0c;都有可能产生中断。在Armv8架构系统中&#xff0c;TEE-OS运行在安全世界的EL1&#xff0c;Rich-OS运行在非安全世界的EL1&#xff0c;而BL31则运行于EL3。想实现各种中断在三种状态下被处理的统…

QT day3 作业2.22

思维导图&#xff1a; 作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到…

JS前端高频面试

JS数据类型有哪些&#xff0c;区别是什么 js数据类型分为原始数据类型和引用数据类型。 原始数据类型包括&#xff1a;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff0c;和es6新增的两种类型&#xff1a;bigint 和 symbol。&am…

2.22作业

test.c #include "test.h" seq_p creat_list(){seq_p L(seq_p)malloc(sizeof(seq_list));if(LNULL){printf("申请空间失败\n");return 0;}L->len0;return L; } int seq_p_empt(seq_p L){if(LNULL){return -12;}return L->len0?1:0; } int seq_p_fu…

PostgreSQL教程(二):pg安装、架构基础、创建并访问数据库

安装 自然&#xff0c;在你能开始使用PostgreSQL之前&#xff0c; 你必须安装它。PostgreSQL很有可能已经安装到你的节点上了&#xff0c; 因为它可能包含在你的操作系统的发布里&#xff0c; 或者是系统管理员已经安装了它。如果是这样的话&#xff0c; 那么你应该从操作系统…

BabylonJS 6.0文档 Deep Dive 动画(一):动画介绍

1. 动画介绍 无论动画如何实现&#xff0c;它都必须考虑所需的动作、时间、产生所需流动性所需的帧数以及序列中的关键点。这个介绍应该有助于理解Babylon.js是如何进行动画的&#xff0c;以及它们是如何实现的。 动画由一系列图像、帧生成&#xff0c;这些图像、帧一个接一个地…

Google插件Sider: ChatGPT Sidebar + GPTs GPT-4 Turbo Sider

Sider: ChatGPT Sidebar 可以使得满屏都是机器人&#xff0c;左侧栏可以打开访问GPT-4. 配置跳板机地址 google 搜索的右侧也有打开

MATLAB环境下基于短时傅里叶变换和Rényi熵的脑电信号和语音信号分析

傅里叶变换是不能很好的反映信号在时域的某一个局部范围的频谱特点的&#xff0c;这一点很可惜。因为在许多实际工程中&#xff0c;人们对信号在局部区域的特征是比较关心的&#xff0c;这些特征包含着十分有用的信息。这类信号因为在时域(或者是空间域)上具有突变的非稳定性和…

C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

目录 1. 结构体类型的声明1.1 结构的声明1.2 结构体变量的创建和初始化1.3 结构的特殊声明---匿名结构体1.4 结构的自引用 2.结构体内存对齐&#xff08;重点&#xff01;&#xff01;&#xff09;2.1 对齐规则2.2 例题讲解2.3 为什么存在内存对齐&#xff1f;2.4 修改默认对齐…

华为全新研发中心即将启用,投资超百亿 | 百能云芯

2月19日 &#xff0c;上海市发改委网站发布了《2024年上海市重大工程清单》&#xff0c;内容涉及科技产业、社会民生、生态文明建设、城市基础设施、城乡融合与乡村振兴等五大类&#xff0c;共191项重大工程。 191项重大工程中&#xff0c;科技产业类占比最多&#xff08;76项&…

Spring Boot打war包部署到Tomcat,访问页面404 !!!

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 Spring Boot打war包部署到Tomcat&#xff0c;访问页面404 &#xff01;&#xff01;&#xff01;解决办法&#xff1a;检查Tomcat版本和Jdk的对应关系&#xff0c;我的Tomcat是6.x&#x…

RK3568平台开发系列讲解(Linux系统篇)通过I2C总线访问客户端方法

🚀返回专栏总目录 文章目录 一、普通I2C通信二、系统管理总线(SMBus)兼容函数三、在开发板配置文件中实例化I2C设备(弃用的旧方式)沉淀、分享、成长,让自己和他人都能有所收获!😄 串行总线事务只是访问寄存器来设置/获取其内容。I2C遵循该规则。I2C内核提供两种API,…

(十二)【Jmeter】线程(Threads(Users))之setUp 线程组

简述 操作路径如下: 作用:在正式测试开始前执行预加载或预热操作,为测试做准备。配置:设置预加载或预热操作的采样器、循环次数等参数。使用场景:确保在正式测试开始前应用程序已经达到稳定状态,减少测试结果的偏差。优点:提供预加载或预热操作,确保测试的准确性。缺…

Code Control Process

代码提交流程&#xff08;Code Control Process&#xff09; VSS&#xff0c;早前定义的版本控制&#xff0c;没有谁对不对&#xff0c;但是要根本解决冲突&#xff0c;特别人多的时候&#xff0c;50个人的时候&#xff0c;处理冲突时非常的麻烦的&#xff0c;改半天还改错了&…

C++模板从入门到入土

1. 泛型编程 如果我们需要实现一个不同类型的交换函数&#xff0c;如果是学的C语言&#xff0c;你要交换哪些类型&#xff0c;不同的类型就需要重新写一个来实现&#xff0c;所以这是很麻烦的&#xff0c;虽然可以cv一下&#xff0c;有了模板就可以减轻负担。 下面写一个适…