哈希表
哈希表 = 散列表
key:value 键值对
python的哈希表就是字典,c++是std::map
哈希碰撞:两个不同的key通过同一个哈希函数得到了相同的内存地址
哈希表中不存在访问
搜索O(1)如果发生哈希碰撞他的时间复杂度就是O(K)k是碰撞的元素个数
插入O(1)
删除O(1)
常用操作:
1.创建哈希表
2.添加元素
3.删除元素
4.修改元素
5.获取key的值
6.检查key是否存在
7.哈希表长度
8.哈希表是否还有元素
217
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
示例 1:
输入:nums = [1,2,3,1]
输出:true
示例 2:
输入:nums = [1,2,3,4]
输出:false
示例 3:
输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
class Solution { public: bool containsDuplicate(vector<int>& nums) { map<int, int> hash_map; for (auto i = nums.begin(); i != nums.end(); ++i) { if (hash_map[*i] == 0) { hash_map[*i] = 1; } else { return true; } } return false; } };
389
给定两个字符串 s 和 t ,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。
示例 2:
输入:s = "", t = "y"
输出:"y"
提示:
0 <= s.length <= 1000
t.length == s.length + 1
s 和 t 只包含小写字母
class Solution { public: char findTheDifference(string s, string t) { map<char, int> hash_map; for (size_t i = 0; i < t.size(); ++i) { hash_map[t[i]] += 1; } for (size_t i = 0; i < s.size(); ++i) { hash_map[s[i]] -= 1; } for (size_t i = 0; i < t.size(); ++i) { if (hash_map[t[i]] != 0) { return t[i]; } } return ' '; } };
496
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。
返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
示例 2:
输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
提示:
1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 104
nums1和nums2中所有整数 互不相同
nums1 中的所有整数同样出现在 nums2 中
class Solution { public: vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) { vector<int> rslt; map<int, int> hash_map; for (size_t i = 0; i < nums1.size(); ++i) { rslt.push_back(-1); } for (size_t i = 0; i < nums2.size(); ++i) { hash_map[nums2[i]] = i; } for (size_t i = 0; i < nums1.size(); ++i) { for (size_t j = hash_map[nums1[i]]; j < nums2.size(); ++j) { if (nums2[j] > nums1[i]) { rslt[i] = nums2[j]; break; } } } return rslt; } };