LeetCode No.36 Valid Sudoku | #HashSet #Wrapper Classes

Q:

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character '.'.


Note:A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

A:

這個題目并不是要找數(shù)獨unfilled區(qū)域的solution曲横,而是要check每個filled cells是否valid桃移。

public boolean isValidSudoku(char[][] board) {
    for(int i = 0; i<9; i++){
        HashSet<Character> rows = new HashSet<Character>();  //注釋1
        HashSet<Character> columns = new HashSet<Character>();  //注釋4
        HashSet<Character> cube = new HashSet<Character>();

        for (int j = 0; j < 9;j++){
            if(board[i][j]!='.' && !rows.add(board[i][j]))  //注釋2
                return false;

            if(board[j][i]!='.' && !columns.add(board[j][i]))
                return false;

            int RowIndex = 3*(i/3);   //注釋3
            int ColIndex = 3*(i%3);

            if(board[RowIndex + j/3][ColIndex + j%3]!='.' 
                   && !cube.add(board[RowIndex + j/3][ColIndex + j%3]))
                return false;
        }
    }
    return true;
}

注釋1:

為什么類型里要用Character字柠,不可以寫成char无拗?
正如Integer之于int,char是基本數(shù)據(jù)類型(primitive type)概疆,Character是包裝類型(Wrapper Classes独旷,也就是類,實例化出來的叫對象)芯义,其中還涉及到自動封箱(Autoboxing),自動拆解(extracts):

example 1:
int t = 10; Integer t1 = t; //自動封箱

Integer t = new Integer(10); int t1 = t ; //自動解封

example 2:
Interger = obj1; int num1 = 69; obj1 = num1; //自動封箱

Integer obj2 = new Integer (69); int num2; num2 = obj2; //自動解封

初次之外很重要的一點妻柒,Character作為char的包裝類扛拨,作為一個類,它提供了很多方法举塔。比如當我們使用HashSet.add()這個方法時绑警,設(shè)計到object.equals()等方法,所以包裝類的意義就體現(xiàn)出來了央渣。

還有個情況计盒,就是在數(shù)據(jù)類型不統(tǒng)一的時候,在操作數(shù)據(jù)的時候容易引起錯誤痹屹,報出“java.lang.ClassCastException”章郁,比如Integer類型沖突了String,通過泛型志衍,也可以進行一個限制暖庄,參考(http://www.cnblogs.com/lwbqqyumidi/p/3837629.html)。


注釋2:

先來看一下 java.util.HashSet.add() HashSet API方法:

public boolean add (E e)
Adds the specified element to this set if it is not already present. More formally, adds the specified element e to this set if this set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false.
Specified by:
add in the interface Collection<E>
add in interface Set<E>
Overrides:
add in class AbstractCollection<E>
Returns:
true if this set did not already contain the specified element

由此可知楼肪,!rows.add(board[i][j])表達的意思是當要加入新的數(shù)字時培廓,如果不成功,說明matrix里已經(jīng)存在了春叫,那么這時出現(xiàn)了重復的值肩钠,要返回false,但暂殖!之后价匠,返回true。如果那個cell的值也不是'.'呛每,說明那個cell是有數(shù)字的踩窖。邏輯與(&&)操作之后,true && true晨横,則判斷條件成立洋腮,return false

HashSet vs HashMap
HashSet 實現(xiàn)了Set接口手形。不允許重復的值啥供。 .add()
HashMap實現(xiàn)了Map接口。不允許重復的鍵库糠。.put()

Map接口有兩個基本的實現(xiàn)伙狐,HashMap和TreeMap。TreeMap保存了對象的排列次序,而HashMap則不能鳞骤。HashMap允許鍵和值為null窒百。HashMap是非synchronized的。

HashMap <Key, Value>豫尽,而我們這里參數(shù)進來其實不需要鍵值篙梢,使用Character封裝類,匹配parameter char[][] board就好美旧。

HashSet類維護了一個HashMap引用作為自己的成員變量:
public HashSet() { map = new HashMap<E,Object>(); }
HashSet源碼分析:http://blog.chinaunix.net/uid-26864892-id-3167656.html


注釋3:

@jaqenhgar 解釋了這里運算背后的邏輯:

0,0, 0,1, 0,2; < --- 3 Horizontal Steps followed by 1 Vertical step to next level.
1,0, 1,1, 1,2; < --- 3 Horizontal Steps followed by 1 Vertical step to next level.
2,0, 2,1, 2,2; < --- 3 Horizontal Steps.
And so on...But, the j iterates from 0 to 9.
But we need to stop after 3 horizontal steps, and go down 1 step vertical.

Use % for horizontal traversal. Because % increments by 1 for each j : 0%3 = 0 , 1%3 = 1, 2%3 = 2, and resets back. So this covers horizontal traversal for each block by 3 steps.
Use / for vertical traversal. Because / increments by 1 after every 3 j: 0/3 = 0; 1/3 = 0; 2/3 =0; 3/3 = 1.

So far, for a given block, you can traverse the whole block using just j.
But because j is just 0 to 9, it will stay only first block. But to increment block, use i. To move horizontally to next block, use % again : ColIndex = 3 * (i%3) (Multiply by 3 so that the next block is after 3 columns. Ie 0,0 is start of first block, second block is 0,3 (not0,1);
Similarly, to move to next block vertically, use / and multiply by 3 as explained above. Hope this helps.

逐個block traversal
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渤滞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榴嗅,更是在濱河造成了極大的恐慌妄呕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗽测,死亡現(xiàn)場離奇詭異绪励,居然都是意外死亡,警方通過查閱死者的電腦和手機唠粥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門疏魏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晤愧,你說我怎么就攤上這事大莫。” “怎么了官份?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵只厘,是天一觀的道長。 經(jīng)常有香客問我舅巷,道長羔味,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任钠右,我火速辦了婚禮赋元,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爬舰。我一直安慰自己,他們只是感情好寒瓦,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布情屹。 她就那樣靜靜地躺著,像睡著了一般杂腰。 火紅的嫁衣襯著肌膚如雪垃你。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音惜颇,去河邊找鬼皆刺。 笑死,一個胖子當著我的面吹牛凌摄,可吹牛的內(nèi)容都是我干的羡蛾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锨亏,長吁一口氣:“原來是場噩夢啊……” “哼痴怨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起器予,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浪藻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乾翔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爱葵,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年反浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了萌丈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡勾习,死狀恐怖浓瞪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巧婶,我是刑警寧澤乾颁,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站艺栈,受9級特大地震影響英岭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湿右,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一诅妹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毅人,春花似錦吭狡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缔俄,卻和暖如春弛秋,著一層夾襖步出監(jiān)牢的瞬間器躏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蟹略, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留登失,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓挖炬,卻偏偏與公主長得像揽浙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子茅茂,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗捏萍。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 五更寒夜炊煙升,淡淡粥香夢中聞空闲。 未待起身穿衣時令杈,慈母輕輕送食至。 針刺糙手渾不知碴倾,夜夜守兒不覺遲逗噩。 何待日后功名...
    拾漁閱讀 257評論 0 0
  • 運動健身后异雁,我們需要通過食物來給身體補充能量,讓自己恢復體力僧须,并且緩解疲勞感纲刀。 運動過后,大家一般都會有不同程度上...
    一顆梧桐樹閱讀 548評論 0 3
  • 這張圖有多少人能看的懂担平?一般沒有很強鉆研精神的前端開發(fā)者來說示绊,沒個三年工作經(jīng)驗都不能清楚的把這個原理一一道來,想分...
    Ziksang閱讀 466評論 1 6
  • 忙碌的一周 這周感覺時間過的最快暂论。一晃這周都要完了面褐。但人生沒有退路,所以勇往直前吧取胎! 今天的刑事庭審開的很爽展哭,不過...
    徵羽微涼閱讀 200評論 0 0