【数据结构】两个有序数组的交集的java实现

版权声明:无意呢。 https://blog.csdn.net/qq_41900081/article/details/86531432

题目:

给定两个有序整型数组array_1和array_2,数组的元素是递增的,且数组中没有重复的元素,计算array_1和array_2的交集。

常规解法:二路归并

//求两个有序数组的交集
	static int getIntersection(int array_1[],int len1,int array_2[],int len2,List<Integer> c) {
		int i = 0, j = 0, k = 0;
		while(i < len1 || j <len2) {
			if(array_1[i] == array_2[j]) {
				c.add(array_1[i]);
				i++;
				j++;
				k++;
			}else if(array_1[i] > array_2[j]) {
				j++;
			}else if(array_1[i] < array_2[j]) {
				i++;
			}
		
		}
		return k;
		
	}

如果 遇到两个长度差距悬殊的数组,则可以选择更优的算法:

我们可以遍历短的数组,然后使用二分查找(有序)在长数组中查找,如果找到了就放进交集元素数组中,否则继续遍历,直到遍历完短数组为止。

 //求两个长度悬殊的有序数组的交集
	static int getIntersection(int array_1[],int array_2[],List<Integer> c) {
		int long_[] = null;
		int short_[] = null;
		if(array_1.length <= array_2.length) {
			short_ = array_1;
			long_ = array_2;		
		}else {
			short_ = array_2;
			long_ = array_1;
		}
		
		for(int i = 0;i < short_.length; i++) {
			int result = Arrays.binarySearch(long_,short_[i]);
			if(result > 0) {
				c.add(short_[result]);
			}	
		}
		return 0;
	}

完整测试代码

package dataStructure;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MyArray {
	//打印数组
	static void Print(List<Integer> c) {
		for(int a : c) {
			System.out.print(a + " ");
		}
	}
	//求两个有序数组的交集
	static int getIntersection(int array_1[],int len1,int array_2[],int len2,List<Integer> c) {
		int i = 0, j = 0, k = 0;
		while(i < len1 || j <len2) {
			if(array_1[i] == array_2[j]) {
				c.add(array_1[i]);
				i++;
				j++;
				k++;
			}else if(array_1[i] > array_2[j]) {
				j++;
			}else if(array_1[i] < array_2[j]) {
				i++;
			}
		
		}
		return k;
		
	}
	 //求两个长度悬殊的有序数组的交集
	static int getIntersection(int array_1[],int array_2[],List<Integer> c) {
		int long_[] = null;
		int short_[] = null;
		if(array_1.length <= array_2.length) {
			short_ = array_1;
			long_ = array_2;		
		}else {
			short_ = array_2;
			long_ = array_1;
		}
		
		for(int i = 0;i < short_.length; i++) {
			int result = Arrays.binarySearch(long_,short_[i]);
			if(result > 0) {
				c.add(short_[result]);
			}	
		}
		return 0;
	}
	public static void main(String[] args) {
		int a[] = {2,5,6,8,9};
		int b[] = {1,5,6,7,9};
		List<Integer> c =new ArrayList<>();
		//getIntersection(a, a.length, b, b.length, c);
		getIntersection(a, b, c);
		Print(c);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41900081/article/details/86531432