设计一种算法来查找两个排序的数字列表中的所有常见元素

时间:2015-10-18 02:26:28

标签: algorithm analysis

设计算法以查找两个排序的数字列表中的所有常见元素。例如。对于列表2,4,4,4,7和1,2,4,6,4,4,7,输出应该是2,4,4,7您使用哪种算法设计技术?为什么?如果两个给定列表的长度分别为m和n,则算法所做的最大和最小比较次数是多少

 vector<int>  findCommon(vector<int> arr1, vector<int>arr2){
 vector<int> intersection;
 int n1 = arr1.size();
 int n2 = arr2.size();
 int k = 0, x = 0;
 while (x < n1 && k < n2) {
 if (arr1[x] > arr2[k]) {
 l++;
} else if (arr2[k] > arr1[x]) {
  k++;
} else {
  intersection.push_back(arr1[i]);
  x++;
  k++;
}
}
return intersection; 

使用蛮力算法作为上述设计技术。 复杂度为O(m + n),因为在最坏的情况下,两个数组之间不会有交集,我们需要将第一个索引增加总共m次,并将第二个索引增加总共n次,这是一个总共m + n次。

1 个答案:

答案 0 :(得分:2)

从指向数组开头的两个索引开始。如果这些索引指向的元素是相同的,那么它是一个共同的元素,我们推进这两个指针。如果一个元素较小,则前进该指针(希望找到下一个相等的元素)。继续这个,直到两个指数中的任何一个到达终点。

这是最有效的算法,因为这两个列表已经排序。