java笔试算法 - 两个有序数组的公共部分
题目:两个有序数组的公共部分
坑:大于时间复杂度O(N)算0分
1.无脑遍历
public void FindCom(int[] a,int[] b){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
if (a[i] == b[j]){
System.out.print(a[i]+" ");
}
}
}
}
时间复杂度O(N*M)
2.二分查找
public boolean binarySearch(int a,int[] b){
int left = 0;
int right = b.length-1;
while (left <= right){
int mid = (left+right)/2;
if (b[mid] > a){
right = mid-1;
}else if (b[mid] < a){
left = mid+1;
}else {
return true;
}
}
return false;
}
public void FindCom(int[] a,int[] b){
for (int i = 0; i < a.length; i++) {
if (binarySearch(a[i],b)){
System.out.print(a[i]+" ");
}
}
}
时间复杂度为O(M*logN)
3.HashHSet
public void FindCom(int[] a,int[] b){
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < a.length; i++) {
hashSet.add(a[i]);
}
for (int i = 0; i < b.length; i++) {
if (hashSet.contains(b[i])){
System.out.print(b[i]+" ");
}
}
}
时间复杂度为O(M+N),空间复杂度为O(M).
4.双指针法
public void FindCom(int[] a,int[] b){
for (int i = 0,j = 0; i < a.length && j < b.length ; ) {
if (a[i] < b[j]){
i++;
}else if (a[i] > b[j]){
j++;
}else {
System.out.print(a[i] + " ");
i++;
j++;
}
}
}
时间复杂度为O(M+N)
测试代码
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,8,9};
int[] b = {1,3,5,7,9};
solution solution = new solution();
solution.FindCom(a,b);
}
总结:
多做,短时间内好方法是想不到的,有了一定的积累量才能快速反应。遇到双数组试者考虑双指针法。

浙公网安备 33010602011771号