问题描述:已知两个整型数组f[]和g[],它们的元素都已经从小到大排列,并且每个数组中的元素各是各不相同的。例如,f[]中可能是1,3,4,7,9而g[]中可能是3,5,7,8,10。请写一个程序算出这两个数组中有多少组元素是相等的。例如f[2]=g[1]=3,f[4]=g[3]=8,因此上面的例子有两组。
思路:一般情况下,很容易想到下面的方法:
1.固定f[i],检查g[]中的每个元素,看是否有元素与之相等
2.处理f[i+1]的情况
3.循环1,2
这样做肯定是可以解决问题的,但是这么做就没有充分利用到题设的两个重要条件:它们的元素都已经从小到大排列,并且每个数组中的元素各是各不相同的。进一步分析,我们会发现,两个数组中元素比较无外乎三种情况:
1.f[i]>g[j]:f[i]与g[j]不等,并且g[]中不可能有与f[i]相等的元素了,对f[i+1]的比较从j开始;
2.f[i]=g[j]:f[i]与g[j]相等,对f[i+1]的比较从j+1开始;
3.f[i]>g[j]:f[i]与g[j]不等,还有可能找到,因此j++。
下面给出一种实现代码:
- #include<stdio.h>
- /********************************************
- *计算两个数组中相同元素的个数
- *两个数组都满足如下条件
- ********************************************/
- intGetSameElementCount(constinta[],intm,constintb[],intn)
- {
- //数组a和b的下标索引
- inti,j;
- intcount=0;
- intyStart=0;
- intnum=0;
- for(i=0;i<m;i++)
- {
- for(j=yStart;j<n;j++)
- {
- if(a[i]<b[j])
- {
- yStart=j;
- break;
- }
- elseif(a[i]==b[j])
- {
- yStart=j+1;
- count++;
- break;
- }
- }
- }
- returncount;
- }
- intmain(void)
- {
- intarr1[]={1,3,4,7,9};
- intarr2[]={3,5,7,8,10};
- intresult=GetSameElementCount(arr1,5,arr2,5);
- printf("TheEQ_COUNTis%d\n",result);
- return0;
- }