判断两个数组中是否存在相同的数字 给定两个排好序的数组,怎样高效得判断这两个数组中存在相同的数字? 这个问题首先想到的是一个O(nlogn)的算法。就是任意挑选一个数组,遍历这个数组的所有元素,遍历过程中,在另一个数组中对第一个数组中的每个元素进行binary search。用C++实现代码如下:
bool findCommon(int a[],int size_a,int b[],int size_b) { for (int i=0;i!=size_a;i++) { int low=0,high=size_b-1,mid; while(low<=high) { mid=(low+high)/2; if(a[i]==b[mid]) return true; else if(a[i]<b[mid]) high=mid-1; else low=mid+1; } } return false; }
后来发现有一个 O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。
bool findCommon(int a[],int size_a,int b[],int size_b) { int i=0,j=0; while(i<size_a&&j<size_b) { if(a[i]==b[j]) return true; if(a[i]>b[j]) j++; if(a[i]<b[j]) i++; } return false; }
本文探讨了两种高效的算法来判断两个已排序数组中是否存在相同的数字。一种是O(nlogn)复杂度的方法,通过遍历其中一个数组并对另一个数组进行二分查找;另一种是O(n)复杂度的方法,只需遍历一次数组即可。
9978

被折叠的 条评论
为什么被折叠?



