LeetCode刷題心得 -- map的妙用

在LeetCode上刷了一波關於數組的題,我有一個好習慣,每次做完題都會去看一下官方的解法和其他大佬留在評論區的解法。
我發現,在和計數(我詞彙量比較匱乏,這個“計數”,是一個橫廣闊的場景)的過程中,map出現的頻率非常之高,和哈希表有的一拼。
我想可能是哈希表難度太高吧,爲了照顧我們這些菜鳥看得懂,特地降低了難度。

在我前面幾篇刷題筆記中,可以隨便找些題目,看完之後,馬上就可以學以致用(當然,代碼別看)

筆記1
筆記2
筆記3
筆記4


我們先拿筆記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,只願一鍵對一值

當然,我有要補充的:

  1. 看示例
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會根據鍵值自動排序。我也不知道之前在哪裏看到說不會自動排,真是坑死我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章