每日一題: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.pswp.cn/news/383575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383575.shtml
英文地址,請注明出處:http://en.pswp.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;經常到網…