在LeetCode上刷了一波關於數組的題,我有一個好習慣,每次做完題都會去看一下官方的解法和其他大佬留在評論區的解法。
我發現,在和計數(我詞彙量比較匱乏,這個“計數”,是一個橫廣闊的場景)的過程中,map出現的頻率非常之高,和哈希表有的一拼。
我想可能是哈希表難度太高吧,爲了照顧我們這些菜鳥看得懂,特地降低了難度。
在我前面幾篇刷題筆記中,可以隨便找些題目,看完之後,馬上就可以學以致用(當然,代碼別看)
我們先拿筆記2裏面的第二題來說事兒:
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的算法應該具有線性時間複雜度。
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
對於這題,完全可以把遍歷得到的數全放進映射表(map)中,最後只要遍歷一下映射表就好了,時間複雜度O(n).
再來看一下筆記4裏那個數獨的題目,那題我就是用映射表做的。
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
數獨部分空格內已填入了數字,空白格用 '.' 表示。
示例 1:
輸入:
[
["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
輸出: true
示例 2:
輸入:
[
["8","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]
]
輸出: false
解釋: 除了第一行的第一個數字從 5 改爲 8 以外,空格內其他數字均與 示例1 相同。
但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
一個有效的數獨(部分已被填充)不一定是可解的。
只需要根據以上規則,驗證已經填入的數字是否有效即可。
給定數獨序列只包含數字 1-9 和字符 '.' 。
給定數獨永遠是 9x9 形式的。
> 來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/valid-sudoku
> 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
如果將數獨擴容兩倍,三倍呢?就算不擴容,映射表也比暴力破解要好得多。
說了這麼多,怎麼用呢?
早已準備好了,走近STL–map,只願一鍵對一值
當然,我有要補充的:
- 看示例
map<char, int> ID_Num;
ID_Num['1'] = 0;
ID_Num['2'] = 0;
ID_Num['3'] = 0;
ID_Num['4'] = 0;
ID_Num['5'] = 0;
ID_Num['6'] = 0;
ID_Num['7'] = 0;
ID_Num['8'] = 0;
ID_Num['9'] = 0;
可以這樣進行初始化。
然後,
ai = board[i].at(j);
ID_Num[ai]++;
如果map中沒有ai這個鍵值的話,會進行插入,這一點一定要重視起來,今天就在這上面在了跟頭。
2.在插入時,map會根據鍵值自動排序。我也不知道之前在哪裏看到說不會自動排,真是坑死我。