代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

news2024/11/15 13:24:12

今日任务

491.递增子序列

  • 题目链接: https://leetcode.cn/problems/non-decreasing-subsequences/description/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> path;
        int n = nums.size();
        // function<void(int)> dfs = [&](int i)->void{
        //     if(path.size() > 1){
        //         ans.emplace_back(path);
        //     }
        //     if(i == n){
        //         return;
        //     }
        //     vector<bool> visited(201);
        //     for(int j = i; j < n; j++){
        //         if(!path.empty() && nums[j] < path.back() || j > i && nums[j - 1] == nums[j]
        //             || visited[nums[j] + 100]){
        //             continue;
        //         }
        //         visited[nums[j] + 100] = true;
        //         path.push_back(nums[j]);
        //         dfs(j + 1);
        //         path.pop_back();
        //     }
        // };


        // 选或不选
        function<void(int)> dfs = [&](int i)->void{
            if(i == n){
                if(path.size() > 1){
                    ans.emplace_back(path);
                }
                return;
            }

            // 不选
            if(path.empty() || nums[i] != path.back()){
                dfs(i + 1);
            }

            // 选
            if(path.empty() || nums[i] >= path.back()){
                path.push_back(nums[i]);
                dfs(i + 1);
                path.pop_back();
            }
        };
        dfs(0);
        return ans;
    }
};

46.全排列

  • 题目链接: https://leetcode.cn/problems/permutations/description/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ans;
        int n = nums.size();
        vector<int> path(n);
        // vector<bool> visit(n);
        // function<void(int)> dfs = [&](int i)->void{
        //     if(i == n){
        //         ans.emplace_back(path);
        //         return;
        //     }
        //     for(int j = 0; j < n; j++){     
        //         if(!visit[j]){
        //             path[i] = nums[j]; //
        //             visit[j] = true;
        //             dfs(i + 1); // 
        //             visit[j] = false;
        //         }
        //     }
        // };

        function<void(int)> dfs = [&](int i)->void{
            if(i == n){
                ans.emplace_back(path);
                return;
            }
            for(int j = 0; j < n; j++){     
                if(nums[j] <= 10){
                    path[i] = nums[j]; //
                    nums[j] += 21;
                    dfs(i + 1); // 
                    nums[j] -= 21;
                }
            }
        };
        dfs(0);
        return ans;
    }
};

47.全排列 II

  • 题目链接: https://leetcode.cn/problems/permutations-ii/description/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> ans;
        int n = nums.size();
        vector<int> path;
        ranges::sort(nums);
        vector<int> visited(n);
        function<void(int)> dfs = [&](int i)->void{
            if(i == n){
                ans.emplace_back(path);
                return;
            }

            for(int j = 0; j < n; j++){
                if(visited[j] || j > 0 && nums[j] == nums[j - 1] && !visited[j - 1]){
                    continue;
                }

                path.push_back(nums[j]);
                visited[j] = true;
                dfs(i + 1);
                visited[j] = false;
                path.pop_back();

            }
        };
        dfs(0);
        return ans;
    }
};

332.重新安排行程

  • 题目链接: https://leetcode.cn/problems/reconstruct-itinerary/description/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        vector<string> ans = {"JFK"};
        unordered_map<string, map<string, int>> targets;
        for(auto &ticket : tickets){
            targets[ticket[0]][ticket[1]]++;
        }
        function<bool(int)> dfs = [&](int i)->bool{
            if(ans.size() == i + 1){
                return true;
            }
            for(auto &[destination, cnt] : targets[ans.back()]){
                if(cnt > 0){
                    ans.push_back(destination);
                    cnt--;
                    if(dfs(i)){
                        return true;
                    }
                    ans.pop_back();
                    cnt++;
                }
            }
            return false;
        };
        dfs(tickets.size());
        return ans;
    }
};

51.N皇后

  • 题目链接: https://leetcode.cn/problems/n-queens/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> ans;
        vector<int> columns(n);
        vector<bool> on_path(n), diag1(2 * n - 1), diag2(2 * n - 1);
        function<void(int)> dfs = [&](int r)->void {
            if(r == n){
                vector<string> board(n);
                for(int i = 0; i < n; i++){
                    board[i] = string(columns[i], '.') + 'Q' + string(n - 1 - columns[i], '.');
                }
                ans.emplace_back(board);
                return;
            }
            for(int c = 0; c < n; c++){
                int rc = r - c + n - 1;
                if(!on_path[c] && !diag1[r + c] && !diag2[rc]){
                    columns[r] = c;
                    on_path[c] = diag1[r + c] = diag2[rc] = true;
                    dfs(r + 1);
                    on_path[c] = diag1[r + c] = diag2[rc] = false;
                }
            }
        };
        dfs(0);
        return ans;
    }
};

37.解数独

  • 题目链接: https://leetcode.cn/problems/sudoku-solver/
  • 题目描述
    在这里插入图片描述

Code

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        
        // function<bool(int, int, char)> isValid = [&](int row, int column, char val)->bool{
        //     for(int i = 0; i < 9; i++){
        //         if(board[row][i] == val || board[i][column] == val){
        //             return false;
        //         }
        //     }
        //     int startRow = (row / 3) * 3;
        //     int startCol = (column / 3) * 3;
        //     for(int i = startRow; i < startRow + 3; i++){
        //         for(int j = startCol; j < startCol + 3; j++){
        //             if(board[i][j] == val){
        //                 return false;
        //             }
        //         }
        //     }
        //     return true;
        // };

        // function<bool()> dfs = [&]()->bool{
        //     for(int i = 0; i < 9; i++){
        //         for(int j = 0; j < 9; j++){
        //             if(board[i][j] == '.'){
        //                 for(char c = '1'; c <= '9'; c++){
        //                     if(isValid(i, j, c)){
        //                         board[i][j] = c;
        //                         if(dfs()){
        //                             return true;
        //                         }
        //                         board[i][j] = '.';
        //                     }
        //                 }
        //                 return false;
        //             }
        //         }
        //     }
        //     return true;
        // };
        // dfs();

        // bitset
        vector<bitset<9>> rows(9, bitset<9>());
        vector<bitset<9>> columns(9, bitset<9>());
        vector<vector<bitset<9>>> cells(3, vector<bitset<9>>(3, bitset<9>()));

        function<bitset<9>(int, int)> getPossibleStatus = [&](int x, int y)->bitset<9>{
            return ~(rows[x] | columns[y] | cells[x / 3][y / 3]);
        };

        function<vector<int>()> getNext = [&]()->vector<int>{
            vector<int> ret;
            int minCnt = 10;
            for(int i = 0; i < 9; i++){
                for(int j = 0; j < 9; j++){
                    if(board[i][j] != '.'){
                        continue;
                    }
                    auto cur = getPossibleStatus(i, j);
                    if(cur.count() >= minCnt){
                        continue;
                    }
                    ret = {i, j};
                    minCnt = cur.count();
                }
            }
            return ret;
        };

        function<void(int ,int ,int , bool)> fillNum = [&](int x, int y, int n, bool fillFlag)->void{
            rows[x][n] = (fillFlag) ? 1 :0;
            columns[y][n] = (fillFlag) ? 1 : 0;
            cells[x / 3][y / 3][n] = (fillFlag) ? 1 : 0;
        };

        function<bool(int)> dfs = [&](int i)->bool{
            if(i == 0){
                return true;
            }
            auto next = getNext();
            auto bits = getPossibleStatus(next[0], next[1]);
            for(int n = 0; n < bits.size(); n++){
                if(!bits.test(n)){
                    continue;
                }
                fillNum(next[0], next[1], n, true);
                board[next[0]][next[1]] = n + '1';
                if(dfs(i - 1)){
                    return true;
                }
                board[next[0]][next[1]] = '.';
                fillNum(next[0], next[1], n, false);
            }
            return false;
        };
        int cnt = 0;
        for(int i = 0; i < 9; i++){
            for(int j = 0; j < 9; j++){
                cnt += (board[i][j] == '.');
                if(board[i][j] == '.'){
                    continue;
                }
                int n = board[i][j] - '1';
                rows[i] |= (1 << n);
                columns[j] |= (1 << n);
                cells[i / 3][j / 3] |= (1 << n);
            }
        }
        dfs(cnt);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…

haproxy服务介绍

haproxy 搭建使用开启HAProxy的界面UI配置负载均衡配置web代理 HAProxy&#xff08;High Availability Proxy&#xff09;是一个高性能的TCP/HTTP负载均衡器和代理服务器&#xff0c;广泛用于提升Web应用的可用性和性能。[官网说明](https://docs.haproxy.org/2.8/intro.html#3…

羊大师:户外狂欢羊奶滋养,年轻人的活力养生新潮流

在这个快节奏的时代&#xff0c;年轻人正以他们独有的方式&#xff0c;重新定义着健康与养生的概念。他们深知&#xff0c;气血不足不应是青春的代名词&#xff0c;而应是活力四射的前奏。于是&#xff0c;一群年轻人以“发癫式”打卡的创意方式&#xff0c;将户外活动的乐趣推…

[保姆级教程]uniapp安装使用uViewUI教程

文章目录 创建 UniApp 项目下载uView UI下载安装方式步骤 1: 安装 uView UI步骤 2: 查看uView UI是否下载成功步骤 3: 引入 uView 主 JS 库步骤 4: 引入 uView 的全局 SCSS 主题文件步骤 5: 引入 uView 基础样式步骤 6: 配置 easycom 组件模式注意事项 NPM方式步骤 1: 安装 uVi…

跟代码执行流程,读Megatron源码(二)训练入口pretrain_gpt.py

Megatron-LM默认支持GPT、T5、BERT等多个常见模型的预训练&#xff0c;当下大模型流行&#xff0c;故以pretrain_gpt.py为例做源码的走读。 一. 启动pretrain_gpt.py pretrain_gpt.py为GPT类模型的训练入口&#xff0c;它通过命令行形式被调用&#xff0c;其精确执行路径位于M…

n7.Nginx 第三方模块

Nginx 第三方模块 第三模块是对nginx 的功能扩展&#xff0c;第三方模块需要在编译安装Nginx 的时候使用参数–add-modulePATH指定路径添加&#xff0c;有的模块是由公司的开发人员针对业务需求定制开发的&#xff0c;有的模块是开 源爱好者开发好之后上传到github进行开源的模…

初学Linux之常见指令(上)

初学Linux之常见指令&#xff08;上&#xff09; 文章目录 初学Linux之常见指令&#xff08;上&#xff09;1. Linux下的小技巧热键man 指令 2. ls 指令3. pwd 指令4. cd 指令5. tree 指令6. touch 指令7. mkdir 指令8. rmdir 和 rm 指令9. cp 指令10. mv 指令 1. Linux下的小技…

微信小程序:vant-weapp 组件库、css 变量

vant-weapp 组件库 前往 vant-weapp 官网 npm 使用限制&#xff1a;不支持依赖于 Node.js 内置库、浏览器内置对象、C 插件 的包。 安装 vant-weapp # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i…

Hadoop3:MR程序处理小文件的优化办法(uber模式)

一、解决方案 1、在数据采集的时候&#xff0c;就将小文件或小批数据合成大文件再上传HDFS&#xff08;数据源头&#xff09; 2、Hadoop Archive&#xff08;存储方向&#xff09; 是一个高效的将小文件放入HDFS块中的文件存档工具&#xff0c;能够将多个小文件打包成一个HAR…

Git --- Branch Diverged

Git --- Branch Diverged Branch Diverged是如何形成的如何解决RebaseMerge Branch Diverged是如何形成的 尝试提交并将更改推送到 master 分支时&#xff0c;是否看到这条烦人的消息 原因是&#xff1a; 直到更改 B 之前&#xff0c;我的分支和“origin/master”完全相同。从…

通过HTML/CSS 实现各类进度条的功能。

需求&#xff1a;我们在开发中会遇到使用各式各样的进度条&#xff0c;因为当前插件里面进度条各式各样的&#xff0c;为了方便我们定制化的开发和方便修改样式&#xff0c;我们这里使用HTML和CSS样式来进行开发进度条功能。 通过本文学习我们会明白如何使用 HTML/CSS 创建各种…

Docker_一刀流_好用、好玩还方便_(持续更新)

Docker 简介一、镜像和容器的概念镜像&#xff08;Image&#xff09;容器&#xff08;Container&#xff09;镜像和容器的关系 宿主机二、Dockerfile2.1 什么是Dockerfile2.2 Dockerfile中的常见指令2.3Dockerfile实例2.4 详细扩展 三、镜像3.1 镜像的创建3.2对于镜像的一些常用…

开放原子校源行 | 湖南大学师生一行赴麒麟信安开展专业见习活动

“开放原子校源行”是开放原子开源基金会作为国家级开源公益平台发起的长期性开源教育推广公益项目。项目拟通过资助高校设立开源社团、推广开源课程、设置开源助学金、引导开源实践等方式培育开源人才&#xff0c;加快将开源文化、理念和技术融入校园&#xff0c;引导广大师生…

TCP/IP四层模型、OSI七层模型

OSI定义了网络互连的七层框架&#xff08;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xff09;TCP/IP 四层模型是目前被广泛采用的一种模型&#xff0c;由以下 4 层组成&#xff1a;应用层、传输层、网络层、网络接口层 FTP&#xff08;File Transfer Pro…

Thinkphp开发文档二次整理版

基础部分 安装 环境要求 ​ *php>7.1.0 命令下载 通过Composer进行下载&#xff0c;操作步骤下载软件 phpstudy --->点击软件管理 --->安装Composer --->再点击网站 --->点击管理 --->点击Composer --->复制如下命令代码&#xff1a; ​ 稳定版&…

数据采集卡替代传统仪表的输出功能优势分析

在现代工业控制和科学研究中&#xff0c;数据采集卡和传统仪表在信号输出功能上各有其独特的优势。本期视频将对它们在这一方面的特点进行详细对比分析。 1. 多通道和多种信号输出支持 传统仪表&#xff1a;信号输出较为有限&#xff0c;通常只能提供固定的单一类型信号输出接…

解决 go 引用私有包,安装失败

问题描述 go mod tidy 或者 go run main.go 时&#xff0c;提示失败&#xff0c;例如 no such host&#xff08;设置GOPRIVATE&#xff09;或者 x509: certificate signed by unknown authority 之类的报错&#xff08;设置GOINSECURE&#xff09; 解决 在各种 insteadof 方…

Android 消息发布订阅框架:EventBus

目录 1.是什么 2.如何使用 3.五种线程模型 4.Eventbus2和Eventbus3的区别 一、是什么 EventBus是一款发布/订阅事件总线的框架&#xff0c;使用它可以进行模块间通信、解耦。它可以使用很少的代码&#xff0c;来实现多组件之间的通信&#xff0c;非常的方便。 为什么使用它…

安装caffe-CPU版本并进行训练

目录 前言 0、安装Ubuntu 18.04 版本 输入ls没有反应 ubuntu换源 换源出现的问题 1、安装caffe出现E:Unable to locate package caffe-cpu问题 2、把 code 文件夹下载到 ubuntu 3、在本地使用caffe-CPU&#xff0c;并部署数据标注工具 ATool 问题1 问题2 问题3 命令行…