问题描述:
给出N个正整数,再给出M个正整数,问这M个数中的每个数分别是否在N个数中出现过。N、M <= 10^5;
eg:N=5,M=3,N个正整数为{8,3,7,2,6},欲查询的M个正整数为{7,2,4},于是后者中只有7和2在N个正整数中出现过。
问题解答:
常规思路是:对每个要查询的正整数x,遍历所有N个数,看是否有一个数与 x 相等。这种做法的时间复杂度是O(NM),当N和M都很大时,时间复杂度便会无法承受。
改进思路:可以用空间换时间,即设定一个 bool 型数组 HashTable[10010],让其初始为 false,如果正整数 x 在N中出现过,则让 HashTable[x]=true;然后再遍历M,如果M中的某个数X,HashTable[X]=true则代表这个数在N中也出现过。这样一来,时间复杂度就是O(N+M),空间复杂度为O(n).
#include<cstdio>
#include<iostream>
#include