题目描述一
给定一个严格递增序列A和一个正整数k,在序列A中寻找两个数a、b,使得a+b = k。问有多少对a、b满足条件。注:a、b和b、a算作同一对注:使用hash法实现输入描述第一行两个正整数n、k (1
输入
5 6 1 2 4 5 6
输出
2
解释
1 + 5 = 6、2 + 4 = 6,因此有两对
题目思路
- 首先建立一个哈希表(数组)h,用于记录序列A中每个数的出现次数。
- 初始化满足条件的数对数量ans为0。
- 遍历序列A中的每个数a,对于每个a,判断是否存在另一个数b=k-a,并且b在哈希表h中出现过。
- 如果存在,则将ans增加h[b](即b的出现次数),表示有h[b]个数对满足条件。
- 输出ans,表示满足条件的a和b的对数。
代码:
for(int i=0; i
int complement = k - num;
if(complement >= 0 && h[complement] > 0)
以输入 "5 6 1 2 4 5 6" 为例,其中5表示序列A的元素个数,6表示给定的和,后面的数字表示序列A中的元素。经过计算,得到两个满足条件的数对:1+5=6和2+4=6,因此输出结果为2。
题目描述二
给定一个包含n个正整数的集合S1,再给定一个包含m个正整数的集合S2,求两个集合的差集,即S1 — S2。
输入描述
第一行两个正整数n、m (1
输出描述
按升序输出集合Si和S2的差集。结果之间用空格隔开,行末不允许有多余的空格。
样例1
54125682467输出
158
解释:从集合Si中去掉集合S2中存在的整数2和6,还剩下(1,5,8)
- 首先定义一个bool类型的哈希表hashtable,大小为MAXN (10001)。用于记录集合S1中的元素是否存在。
- 使用for循环读取集合S1的n个成员,并将对应的hashtable[x]设置为true,表示元素x存在于集合S1中。
- 使用for循环读取集合S2的m个成员,并将对应的hashtable[x]设置为false,如果元素x在集合S1中存在,则会被标记为false,表示元素x不属于差集。
- 使用一个flag变量控制输出格式,初始值为true。
- 使用for循环遍历hashtable数组,如果hashtable[i]为true,则输出i,同时将flag设置为false,表示已经输出了至少一个元素。
- 输出结束,返回0。
代码
bool hashtable[MAXN] = {false};
for(int i = 0; i < n; i++)
for(int i = 0; i < m; i++)
for(int i = 0; i < MAXN; i++)