Java学习手册:(数据结构与算法-数组)如何计算两个有序整型数组的交集?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/MaybeForever/article/details/102417313

问题描述:

假设两个含有n个元素的有序(非降序)整型数组a和b,其中a = {0,1,2,3,4},b = {1,3,5,7,9},那么它们的交集为{1,3}。

方法一:

二路归并法。设两个数组分别为array1[n1],array2[n2],从i,j开始分别遍历两个数组,在遍历的过程中,如果当前遍历位置的array1[i]与array2[j]相等,则此数为两个数组的交集,记录下来,并继续向后遍历array1和array。若array1[i]大于array2[j],则须继续向后遍历array2。若array1[i]小于array2[j],则须继续向后遍历array1。直到有一个数组结束遍历则结束。

方法一代码如下:

package com.haobi;

import java.util.ArrayList;

public class Test27 {
	public static void main(String[] args) {
		int[] a = {0,1,2,3,4};
		int[] b = {1,3,5,7,9};
		ArrayList<Integer> mix = mixed(a, b);
		for(int i=0;i<mix.size();i++) {
			System.out.print(mix.get(i)+" ");
		}
	}
	
	public static ArrayList<Integer> mixed(int array1[], int array2[]){
		ArrayList<Integer> mix = new ArrayList<Integer>();
		int i=0,j=0;
		int n1 = array1.length;
		int n2 = array2.length;
		while(i<n1 && j<n2) {
			if(array1[i]==array2[j]) {
				mix.add(array1[i]);
				i++;
				j++;
			}else if(array1[i]>array2[j]) {
				j++;
			}else if(array1[i]<array2[j]) {
				i++;
			}
		}
		return mix;
	}
}

程序输出结果如下:

1 3 

方法二:

顺序遍历法。顺序遍历两个数组,将数组元素存放在哈希表中,同时对数组元素进行计数,若为2,则为二者的交集元素。

方法二代码如下:

package com.haobi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Test28 {
	public static void main(String[] args) {
		int[] a = {0,1,2,3,4};
		int[] b = {1,3,5,7,9};
		ArrayList<Integer> mix = mixed(a, b);
		for(int i=0;i<mix.size();i++) {
			System.out.print(mix.get(i)+" ");
		}
	}
	
	public static ArrayList<Integer> mixed(int array1[], int array2[]){
		ArrayList<Integer> mix = new ArrayList<Integer>();
		Map<Integer,Integer> map = new HashMap<Integer,Integer>();
		int n1 = array1.length;
		int n2 = array2.length;
		//遍历array1
		for(int i=0;i<n1;i++) {
			if(map.containsKey(array1[i])) {
				map.put(array1[i], map.get(array1[i])+1);
			}else {
				map.put(array1[i], 1);					
			}
		}
		//遍历array2
		for(int j=0;j<n2;j++) {
			if(map.containsKey(array2[j])) {
				map.put(array2[j], map.get(array2[j])+1);
			}else {
				map.put(array2[j], 1);					
			}
		}
		//遍历Map
		for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
			if(entry.getValue() == 2) {
				mix.add(entry.getKey());
			}
		}
		return mix;
	}
}

程序输出结果如下:

1 3 

猜你喜欢

转载自blog.csdn.net/MaybeForever/article/details/102417313