设计算法以查找两个排序的数字列表中的所有常见元素。例如。对于列表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次。
答案 0 :(得分:2)
从指向数组开头的两个索引开始。如果这些索引指向的元素是相同的,那么它是一个共同的元素,我们推进这两个指针。如果一个元素较小,则前进该指针(希望找到下一个相等的元素)。继续这个,直到两个指数中的任何一个到达终点。
这是最有效的算法,因为这两个列表已经排序。