#3745. 序曲-1.3-等值数目
序曲-1.3-等值数目
题目描述
已知两个整数数组 f[] 与 g[],它们的元素都已经从小到大排列好,而且两个数组中的元素都各不相同。例如,f[] 中有1,3,4,7,9,而 g[] 中有3,5,7,8,10。试编写程序算出这两个数组之间有多少组相同的元素。 就上例而言,f[1] 与 g[0] 为3是第一组;f[3] 与 g[2] 为7是第二组。
以下是严格按照用户提供的图片内容完整还原的文本(保留所有原始文字、数学符号和排版格式):
【说明】 建议不要使用下面的方法来编程: (1) 固定 f[i]。 (2) 对于 f[i] 而言,检查 g[] 中是否有与 f[i] 相同的元素。 (3) 处理下一个 f[i],即 f[i+1]。
因为 f[] 都已经从小到大排列好,所以应该活用这一个很强的特性。一个好的程序员绝对不应用上面的笨拙方法来编写程序,这样会做太多无意义的事。
为什么呢?因为 g[] 元素都相异,对于 f[i] 而言,最多只会找出一个与它相同的元素,最坏的情况是把 g[] 全部查完才找出相同元素(如果采用上面的方法)。如果 g[] 中有 n 个元素,需要查 n 次;但是若 f[] 中也有 n 个元素,那么需要把 g[] 查 n 遍,一共作 n² 次比较。
试着找出一种方法,把 f[] 与 g[] 各查一次就可以得到答案(记住,活用 f[] 与 g[] 已经从小到大排列的特性)。
输入格式
- 第一行为整数 n 和 m,分别表示数组 f[] 和 g[] 的长度(1 ≤ n, m ≤ 1000)。
- 第二行包含 n 个升序排列的整数,表示数组 f[] 的元素(范围:[-10000, 10000])。
- 第三行包含 m 个升序排列的整数,表示数组 g[] 的元素(范围:[-10000, 10000])。
输出格式
- 一个整数,表示两个数组中相同元素的组数。
样例输入 1
5 5
1 3 4 7 9
3 5 7 8 10
样例输出 1
2
样例输入 2
4 3
-2 0 5 10
-5 0 10
样例输出 2
2
数据范围
- 数组元素互不相同且严格升序排列。
- 建议时间复杂度:O(n + m)。