LeetCode刷题心得 -- map的妙用

时间:2022-07-23
本文章向大家介绍LeetCode刷题心得 -- map的妙用,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

在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,只愿一键对一值

当然,我有要补充的:

  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会根据键值自动排序。我也不知道之前在哪里看到说不会自动排,真是坑死我。