收藏夹里还有几道之前找技术岗实习收藏的Leetcode题目,这几天把这个挖下的坑给填了,写完这几道真的就和技术岗say goodbye了
LeetCode 目录
LeetCode 4:寻找两个有序数组的中位数 [困难][二分]
LeetCode 54:螺旋矩阵Ⅰ
LeetCode 59:螺旋矩阵 Ⅱ
LeetCode 111: 二叉树的最小深度[递归/非递归求解/队列]
LeetCode 149:一条直线上最多的点数
LeetCode 365:水壶问题 [中等] [DFS][数学]
LeetCode 150:计算逆波兰式(后缀表达式)的值
LeetCode 876:链表的中间节点 [简单]
LeetCode 945: 使数组唯一的最小增量 [中等]
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑
输出结果的顺序。
进阶:
如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
之前把题目意思看错了,就以为是直接的求真正的交集
题目其实意思有2层,
第一层是求交集可以不按顺序输出结果,
第二层是不是我们所理解的“交集”,对于多次出现的同一个数字
也需要输出结果
,可以再理解一下给的示例
使用哈希表存储每个数字出现的次数,因为多次出现的统一数字也需要输出结果,对于一个数字,其在交集中出现的次数等于该数字在两个数组中出现次数的最小值
。
小Tip:为了降低空间复杂度,首先遍历较短的数组并在哈希表中记录每个数字以及对应出现的次数,然后遍历较长的数组得到交集。在哈希表统计之前比较2个数组的元素个数大小。
step1:
首先遍历第一个数组,并在哈希表中记录第一个数组中的每个数字以及对应出现的次数
step2:
然后遍历第二个数组,对于第二个数组中的每个数字,如果在哈希表中存在这个数字,则将该数字添加到答案,并减少哈希表中该数字出现的次数。
我稍微加了一点注释
class Solution {
public:
vector intersect(vector& nums1, vector& nums2) {
if (nums1.size() > nums2.size()) { //选出元素个数较小的数组
return intersect(nums2, nums1);
}
unordered_map m;
for (int num : nums1) { //哈希表统计数组中元素个数以及对应值
++m[num];
}
vector intersection;
for (int num : nums2) { //将哈希表与另外一个数组进行二次比较得出“交集”
if (m.count(num)) {
intersection.push_back(num);
--m[num];
if (m[num] == 0) {
m.erase(num);
}
}
}
return intersection;
}
};
(又遇到了新的知识)
C++ 11的标准中加入了unordered系列的容器。unordered_map记录元素的hash值,根据hash值判断元素是否相同
unordered_map相当于HashMap
迭代器
begin 返回指向容器起始位置的迭代器(iterator)
end 返回指向容器末尾位置的迭代器
cbegin 返回指向容器起始位置的常迭代器(const_iterator)
cend 返回指向容器末尾位置的常迭代器
Capacity
size 返回有效元素个数
max_size 返回 unordered_map 支持的最大元素个数
empty 判断是否为空
元素访问
operator[] 访问元素
at 访问元素
元素修改
insert 插入元素
erase 删除元素
swap 交换内容
clear 清空内容
摘自:详细介绍C++STL:unordered_map