问题描述:已知两个整型数组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++。

下面给出一种实现代码:

  1. #include <stdio.h> 
  2.  
  3. /******************************************** 
  4. *计算两个数组中相同元素的个数 
  5. *两个数组都满足如下条件 
  6. ********************************************/ 
  7. int GetSameElementCount(const int a[], int m, const int b[],int n) 
  8.     //数组a和b的下标索引 
  9.     int i,j; 
  10.     int count = 0; 
  11.     int yStart = 0; 
  12.     int num = 0; 
  13.     for(i = 0; i < m; i++)  
  14.     { 
  15.         for(j = yStart; j < n; j++)  
  16.         { 
  17.             if(a[i] < b[j])  
  18.             { 
  19.                 yStart = j; 
  20.                 break
  21.             } 
  22.             else if(a[i] == b[j]) 
  23.             { 
  24.                 yStart = j + 1; 
  25.                 count++; 
  26.                 break
  27.             } 
  28.         } 
  29.     } 
  30.     return count; 
  31. int main(void
  32.     int arr1[] = {1,3,4,7,9}; 
  33.     int arr2[] = {3,5,7,8,10}; 
  34.     int result = GetSameElementCount(arr1,5,arr2,5); 
  35.     printf("The EQ_COUNT is %d\n",result); 
  36.     return 0;