问题描述:
假设两个含有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