Leetcode 矩阵问题

36题.有效的数独

        此类问题特点是给出行列的多种限定条件,数独限制每行每列每个小九宫格元素范围为1-9且不可重复 。解决此类问题最简单的想法就是使用哈希set,记录每行,每列,每个小九宫格已经出现的元素。在遍历矩阵时提前做出是否重复的判断,若重复一次则直接退出遍历返回假。

        作为哈希set的优化可以使用多维数组存储已经遍历过的元素的数量,只要对应位置上的计数小于等于一则继续遍历,否则直接退出。本质是将遍历到的元素根据其值大小转换到一个对应的位置上,例如值为1,则将值为1的所有数据位置固定在0。建立多个多维数组跟踪行、列、小九宫格的元素重复情况。

Note:对于小九宫格的定位为题是一个常见的套路,因为9乘9矩阵被划分为3乘3的九宫格,所以可以使用[i  / 3][j / 3]去定位九宫格。

多维数组做法:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int colum[9][9], row[9][9], box[3][3][9];

        memset(colum, 0, sizeof(colum));
        memset(row, 0, sizeof(row));
        memset(box, 0, sizeof(box));

        for(int i = 0; i < 9; ++i){
            for(int j = 0; j < 9; ++j){
                char board_ij = board[i][j];
                if(board_ij != '.'){
                    int tmp = board_ij - '0' - 1;
                    ++colum[j][tmp];
                    ++row[i][tmp];
                    ++box[i / 3][j / 3][tmp];
                    if(colum[j][tmp] > 1 || row[i][tmp] > 1 || box[i / 3][j / 3][tmp] > 1)
                        return false;
                }
            }
        }
        return true;
    }
};

哈希set:

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        vector<unordered_set<char>> row(9, unordered_set<char>());
        vector<unordered_set<char>> colum(9, unordered_set<char>());
        vector<vector<unordered_set<char>>> box(3, vector<unordered_set<char>>(3, unordered_set<char>()));
        
        for(int i = 0; i < 9; ++i){
            for(int j = 0; j < 9; ++j){
                char tmp = board[i][j];
                if(tmp != '.'){
                    if(row[i].count(tmp) == 0 && colum[j].count(tmp) == 0 && box[i / 3][j / 3].count(tmp) == 0){
                        row[i].insert(tmp);
                        colum[j].insert(tmp);
                        box[i / 3][j / 3].insert(tmp);
                    }
                    else
                        return false;
                }
            }
        }
        return true;
    }
};

54.螺旋矩阵

        此类问题在实际场景中使用较多,例如旋转图片等。通常为顺时针或者逆时针旋转矩阵,做法很简单。定义上下左右四个边界,在模拟的过程中更新边界即可。即保障先从左到右然后从上到下再者从右到左,最后从下到上。定义u(up) d(down) l(left) r(right)为其上下左右边界,在模拟的过程中更新边界即可。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        int u = 0, d = m - 1, l = 0, r = n - 1;
        vector<int> res;
        while (true) {
            for (int i = l; i <= r; ++i)
                res.emplace_back(matrix[u][i]);
            if(++u > d) break;

            for (int i = u; i <= d; ++i)
                res.emplace_back(matrix[i][r]);
            if(--r < l) break;

            for (int i = r; i >= l; --i)
                res.emplace_back(matrix[d][i]);
            if(--d < u) break;

            for (int i = d; i >= u; --i)
                res.emplace_back(matrix[i][l]);
            if(++l > r) break;
        }
        return res;
    }
};

 48.旋转图像问题

        此类问题需求是把一个矩阵旋转某角度,需要进行坐标转换即可轻松解决。也可以设计原地旋转的算法。

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int n = matrix.size();
        vector<vector<int>> help(matrix);
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < n; ++j){
                matrix[j][n - 1 -i] = help[i][j];
            }
        }
    }
};

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

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

相关文章

一个简单的文件上传功能

代码如下&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam(value "uploadDirectory") String uploadDirectory,RequestParam("fileName") MultipartFile fileName) {try {// 确保文件不…

SQL 29 计算用户的平均次日留存率题解

问题截图如下&#xff1a; SQL建表代码&#xff1a; drop table if exists user_profile; drop table if exists question_practice_detail; drop table if exists question_detail; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar…

国外问卷调查,让你远离酷暑的赚钱新方式

大家好&#xff0c;我是汇舟问卷&#xff0c;一家专注于国外问卷调查领域的互联网企业。随着夏季的到来&#xff0c;高温酷暑无疑给许多人的日常工作带来了极大的不便与挑战。 在这样的季节里&#xff0c;我们都在寻求一种既能实现经济收益又能避免高温炙烤的工作模式。 在此…

Davtest一键远程编辑远程Web服务器上的文件(KALI工具系列三十三)

目录 1、KALI LINUX 简介 2、Davtest 工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2 kali的IP 4、操作实例 4.1 常见漏洞扫描 4.2 身份验证 4.3 特定扫描 4.4 输出结果 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版 &…

windows11 OneDrive禁止开机自启动。

1、先上个图&#xff1a; 开机默认自启&#xff0c;然后设置中&#xff0c;也没有找到可以设置的。 2、然后我们通过任务管理器来处理&#xff0c;右键任务栏&#xff1a; 打开任务管理器&#xff1a; 选中OneDrive&#xff0c;然后点击【禁 用】按钮即可。 或者鼠标右键&…

《分析模式》漫谈08-单继承不是“唯一继承”

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》第2章这一段&#xff1a; 划线处的single inheritance&#xff0c;2004中译本的翻译&#xff1a; 翻译为“单继承”&#xff0c;是正确的。 2020中译本的翻译&#xff1a…

Python 中的抽象语法树

Abstract Syntax Trees in Python 注&#xff1a;机翻&#xff0c;未校对。 Requirement: All examples are compatible with at least Python v3.6, except for using ast.dump() with the attribute indent which has been added in Python v3.9. 要求&#xff1a;所有示例至…

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接&#xff1a;使用ggplot绘制柱状图&#xff0c;在柱子中显示数值和显著性 本期教程 获得本期教程示例数据&#xff0c;后台回复关键词&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可获得往期和未来教程所有数据和代码&#xff09; 往期教程…

【websocket】websocket网课视频记录

仅个人方便回顾。 【WebSocket入门与案例实战-哔哩哔哩】 https://b23.tv/2p1f9t2 课程对应代码仓库: https://gitee.com/duoli-java/websocket-demo.git

【机器学习项目实战(二)】基于朴素贝叶斯的中文垃圾短信分类

完整代码、数据集和相应的报告 链接已经放在了正文最下方, 供大家参考学习 摘要 ​ 本文探讨了中文垃圾短信分类的问题,通过收集实际数据集,运用多种机器学习算法进行分类,并对比了不同算法在垃圾短信分类任务上的性能。本研究旨在提高中文垃圾短信的识别准确率,为构建更…

elasticsearch导出和导入数据

这里我使用的是离线操作的方式&#xff0c; 前提&#xff1a;安装了node, 安装elasticdump命令&#xff1a; npm install elasticdump -g 安装成功后进入elasticdump所在的目录&#xff1a; cd /usr/local/nodejs/lib/node_modules/elasticdump/bin 导出目标索引的映射结构…

Keil5中:出现:failed to execute ‘...\ARMCC\bin\ArmCC‘

点三个点&#xff0c;去自己的磁盘找自己的ARM\ARMCC\bin

写一个坏越的小世界(六)

blog基本已经接近尾声了&#xff0c;稍微再润色下。比如天气模块 这边加一个天气小图标&#xff0c;应该会好点吧~ 当不同天气的时候可以显示不同的图标 介绍这边加了个滚球特效。虽然看着还不是很好看&#xff0c;先凑合着吧 整了个开关灯按钮&#xff0c;可以切换黑白主题 …

WavRx:新型语音健康诊断模型

近年来&#xff0c;语音作为一种有前景的疾病诊断和远程健康监测手段已经出现。语音健康诊断通常基于这样一个假设&#xff1a;即影响发音和/或呼吸系统的疾病会导致人类语音信号中出现非典型模式。这种异常可能由多种原因造成&#xff0c;例如神经肌肉控制受损或声道和肺部发炎…

【Python】已解决:Python正确安装文字识别库EasyOCR

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;Python正确安装文字识别库EasyOCR 一、分析问题背景 在使用Python进行图像处理和文字识别时&#xff0c;EasyOCR是一个流行的库&#xff0c;它基于PyTorch&…

互联网直播/点播技术与平台创新应用:视频推拉流EasyDSS案例分析

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

同步模式之保护性暂停模式

1. Guarded Suspension&#xff1a;一个线程需要等待另一个线程的执行结果 2. 理解 一个线程需要将结果传递给另一个线程&#xff0c;将这两个线程关联到到同一个 GuardedObject 如果需要源源不断地传递结果&#xff0c;需要使用消息队列&#xff08;生产者-消费者模型&…

基于 SpringBoot + Vue 的图书购物商城项目

本项目是一个基于 SpringBoot 和 Vue 的图书购物商城系统。系统主要实现了用户注册、登录&#xff0c;图书浏览、查询、加购&#xff0c;购物车管理&#xff0c;订单结算&#xff0c;会员折扣&#xff0c;下单&#xff0c;个人订单管理&#xff0c;书籍及分类管理&#xff0c;用…

用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown

Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…

华为OceanStor磁盘阵列存储恢复出厂设置命令 LUN不处于在线状态,不能执行此操作解决方案

环境 OceanStor S2600T V2老版本 客户现场有一台Oceanstor 2600 V2的存储&#xff0c;因和另一台磁盘扩展框做了跨设备LUN需要进行配置清除&#xff0c;配置结束后需要重新划分存储空间并对接服务器&#xff0c;保证业务能够正常上线&#xff01;在清除配置回退的过程中&#…