每日一题:leetcode959.由斜杠划分区域

题目描述

在这里插入图片描述

题目分析

仔细分析这道题以后虽然觉得可能要转化为图之类的,但是完全没有具体的想法,因为每个格子都有三种情况,这三种情况的不同的组合又会产生不同的结果。
发现找不到编码转化为图以后,我分析了一下不同数量方块之间的联系,试图找到像递归一样的关系。发现也没有找到,关键是边长小的方块四周会有边,但是将其放到大方块中并没有这些边,而且他们的边界还会组合。
在没有思路之后我看了一下题解,发现题解最巧妙的地方在于将每一个单元块再次划分为四个小块,从而将原先三种情况统一了起来:每种情况是这四个小块的不同组合方式。然后块与块之间同样通过小块进行拼接。然后再使用并差集得到联通块的个数。
在这里插入图片描述

总结

分解以后使用并查集得到联通分量的个数这个是非常简单的,但是关键在于分解这步自己没有想到。以后遇到问题不应该仅仅思考问题的拼接、分类讨论、递归,而且也应该考虑一下所谓的分类情况能否再进行分解从而将各种分类统一起来。

AC代码

class UnionSet {
public:int n;int setCount;vector<int> father;vector<int> size;UnionSet(int _n):n(_n),setCount(_n),father(_n),size(_n, 1) {iota(father.begin(), father.end(), 0);}int root(int x) {//路径压缩return x == father[x] ? x : father[x] = root(father[x]);}bool unite(int x, int y) {x = root(x);y = root(y);if (x == y) {return false;}if (size[x] < size[y]) {//按秩合并swap(x, y);}father[y] = x;size[x] += size[y];--setCount;return true;}
};
class Solution {
public:int regionsBySlashes(vector<string>& grid) {int n = grid.size();UnionSet us(4 * n * n);for (int i = 0; i < n; ++i) {int idx = 0;    //用于指向对应的字符for (int j =0; j < n; ++j, ++idx) {int base = (i * n + j) * 4; //哈希值switch (grid[i][idx]) {case ' '://空格,将四个块全部合并us.unite(base + 0, base + 1);us.unite(base + 0, base + 2);us.unite(base + 0, base + 3);break;case '/'://斜杠us.unite(base + 0, base + 3);us.unite(base + 1, base + 2);break;case '\\'://反斜杠us.unite(base + 0, base + 1);us.unite(base + 2, base + 3);//++idx;  //因为反斜杠有两个break;}//完成和右边块和下边块的拼接if (j + 1 < n) {//右边块存在int baser = base + 4;us.unite(base + 1, baser + 3);}if (i + 1 < n) {//下边块存在int baseb = 4 * ((i + 1) * n + j);us.unite(base + 2, baseb + 0);}}}//最后联通块的个数return us.setCount;}
};

官方题解是用Java写的,这里就不再贴出。刚开始看到题目中说反斜杠是两个我还想着要对反斜杠特殊处理(代码中的idx变量),结果真的只是编码输出的问题。。。

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

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

相关文章

每日一题:leetcode1319.联通网络的操作次数

题目描述 题目分析 ps&#xff1a;这篇博客是补前天的&#xff0c;前天在老家不方便写博客 题目挺简单的&#xff0c;但是通过题目对图的连通性有了一个更深刻的认识&#xff1a;如果有超过&#xff08;或等于&#xff09;n-1条边&#xff0c;则一定是可以让整个图联通的。 如…

每日一题:leetcode1128.等价多米诺骨牌对数

题目描述 题目分析 看到题目以后第一个想法是遍历数组&#xff0c;对每个元素有一个数据结构中保存了该元素出现的次数&#xff0c;然后往结果中相加&#xff08;表示该元素和前面的对数&#xff09;&#xff0c;然后再将元素出现的次数加一。 思考用什么数据结构保存元素出现…

每日一题:leetcode1579.保证图可完全遍历

题目描述 题目分析 非常惭愧&#xff0c;感觉自己有点畏难心理&#xff0c;看到是困难题第一个想法是自己想不出来。。。 因为自己认为自己做不出来&#xff0c;所以完全不能进行思考&#xff0c;稍微思考一下就觉得不行不行。 我也想到了分别用两个并查集判断各自可以去掉多少…

每日一题:leetcode724.寻找数组的中心索引

题目描述 题目分析 今天这道题原本很简单&#xff0c;我都没打算写题解&#xff0c;当时用手机看的题目&#xff0c;我想着我三分钟应该能写出来&#xff0c;结果没想到wa了三发。。。 对待简单题不要轻视&#xff0c;对待难题不要畏难。 今天的主要问题是没有看数据范围&…

C++Primer学习笔记:第2章 变量和基本类型

空类型不对应具体的值&#xff0c;仅用于一些特殊的场合 long的长度为32位&#xff0c;float有&#xff17;个有效位&#xff0c;double有16个有效位 如果数值超过了int的范围&#xff0c;应该用long long而不是long&#xff0c;long一般和int一样大 在算术表达式中不要使用…

C++Primer学习笔记:第3章 字符串、向量和数组

可以使用using声明而无需专门的前缀&#xff1a;using namespace::name;.。位于头文件的代码一般来说不应该使用using声明&#xff0c;这是因为头文件的内容会拷贝到所有引用他的文件中去&#xff0c;如果头文件中有某个using声明&#xff0c;那么每个使用了该头文件的文件都会…

C++Primer学习笔记:第4章 表达式

表达式由一个或多个运算对象组成&#xff0c;对表达式求值将得到一个结果。字面值和变量是最简单的表达式&#xff0c;其结果就是字面值和变量的值。把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式。 重载运算符包括运算对象的类型和返回值的类型&#xff0…

C++Primer学习笔记:第5章 语句

一个表达式末尾加上分号就变成了表达式语句。最简单的语句是空语句&#xff08;一个单独的分号&#xff09;&#xff1a;语法上需要一条语句但是逻辑上不需要 复合语句是指用花括号括起来的&#xff08;可能为空&#xff09;语句和声明的序列&#xff1a;用在语法上需要一条语…

z3 C++学习笔记

因为项目需要使用z3库来解决问题&#xff0c;所以自己学习了一下&#xff0c;结果发现网上教程比较少&#xff0c;而且大部分都是使用Python&#xff0c;而我本人是C的忠实信徒&#xff0c;在知道C也可以使用z3库以后我毫不犹豫地着手用C使用z3&#xff0c;但是我很快发现&…

C++Primer学习笔记:第6章 函数

通过调用运算符()调用函数 函数的调用完成两项工作&#xff1a; 用实参初始化函数对应的形参将控制权转移给被调用函数&#xff1a;主调函数的执行被暂时中断&#xff0c;被调函数开始执行 尽管实参与形参存在对应关系&#xff0c;但是并没有规定实参的求值顺序。编译器能以任…

C++Primer学习笔记:第8章 IO库

C语言不直接处理输入输出&#xff0c;而是通过一族定义在标准库中的类型来处理IO iostream定义了用于读写流的基本类型fstream定义了读写命名文件的类型sstream定义了读写内存string对象的类型 标准库使得我们能够忽略这些不同类型的流之间的差异&#xff0c;是通过继承机制实…

C++Primer学习笔记:第7章 类

类的基本思想是数据抽象data abstraction和封装encapsulation。数据抽象是一种依赖于接口interface和实现implementation分离的编程技术 在类中&#xff0c;由类的设计者负责考虑类的实现过程&#xff0c;使用该类的程序员只需要抽象地思考类型做了什么&#xff0c;而无须了解…

每日一题:leetcode191.位1的个数

题目描述 题目分析 很自然地想到了二进制枚举&#xff0c;直接循环检查每一个二进制位。 class Solution { public:int hammingWeight(uint32_t n) {int ret 0;uint32_t t 1;for (int i 0; i < 32; i, t << 1) {if (n & t) {ret;}}return ret;} };AC之后看了…

每日一题:leetcode341.扁平化嵌套列表迭代器

题目描述 题目分析 这个题目自己大概花了一个小时&#xff0c;虽然是一遍AC&#xff0c;但是速度有点慢&#xff0c;太长时间不写代码导致自己对代码不太敏感&#xff0c;写起来慢腾腾的。 看到这个的想法就是&#xff0c;要用栈来保存列表的迭代器&#xff0c;这样将孩子列表…

每日一题:leetcode82. 删除排序链表中的重复元素 II

题目描述 题目分析 这才是正常的中等题难度嘛&#xff0c;昨天的中等题题解我半天看不懂。。。 首先&#xff0c;需要增加一个哑节点&#xff08;操作链表的常规操作&#xff09;&#xff0c;因为有可能删除首节点&#xff0c;我们不想要为首节点添加单独的逻辑。其次&#xf…

每日一题:leetcode456.132模式

题目描述 题目分析 我觉得这道题应该是我做过最难的中等题之一了&#xff0c;这是昨天的每日一题&#xff0c;但是昨天用nlogn的做法做出来以后在看题解&#xff0c;发现有些看不懂&#xff08;觉得题解有点故弄玄虚&#xff09;。然后今天中午又花了一点时间才搞懂&#xff0…

leetcode283.移动零

题目描述 题目分析 在写简单题放松&#xff0c;看到这道题第一个想法是用STL库函数&#xff0c;虽然知道大概要用双指针之类的&#xff0c;但是库函数爽哇。 class Solution { public:void moveZeroes(vector<int>& nums) {stable_sort(nums.begin(), nums.end(), …

每日一题:leetcode61.旋转链表

题目描述 题目分析 很容易发现&#xff0c;如果k是n的整数倍&#xff0c;相当于没有移动。这样直接对k%n使得k在一个可以接受的范围。 因为是顺序移动&#xff0c;各元素之间的相对位置保持不变&#xff0c;所以就想着将链表先变成一个环。然后再移动头指针&#xff0c;最后再…

每日一题:leetcode173.二叉搜索树迭代器

题目描述 题目分析 更加地觉得编程重要的不在于如何写代码&#xff0c;用什么具体的技巧&#xff0c;编码本身只是一种将思维呈现的方式&#xff0c;但是如果思维是不清晰的&#xff0c;那么就算懂得再多的编码的奇技淫巧也是没有什么帮助的。相反&#xff0c;如果有一个清晰的…

Ubuntu20.04 Clion/Pycharm/IDEA 输入中文+光标跟随解决方案

ibus输入法&#xff08;弃用&#xff09; 之前一直用的搜狗输入法&#xff0c;但是搜狗输入法无法在Jetbrains全家桶下使用&#xff0c;但是又需要输入中文&#xff0c;没有办法我只能下载了谷歌输入法&#xff0c;十分难用&#xff0c;但是也没有其他办法&#xff0c;经常到网…