一,問題描述
給定兩個整型數組,假設一個長度為M,另一個長度為N。請找出(打印出)這兩個數組中的公共元素。
二,算法分析
有兩種思路求解這個問題。
①使用一個HashSet保存第一個數組中的所有元素,然后遍歷第二個數組中的每個元素,判斷該元素是否在HashSet中。如果在,就表明這個元素是公共元素。
此方法的時間復雜度為O(M+N),空間復雜度為O(M)[假設第一個數組長度為M,保存在HashSet中]。
②首先對兩個數組進行排序。然后分別設置兩個指針 i, j 初始時,分別指向兩個數組的第一個元素,依次比較這兩個指針指向的元素,指向較小的元素的那個指針向后移一位。如果,兩個元素相同,則兩個指針同時向后移一位。
此方法,首先需要對數組排序,時間復雜度為O(MlogM + NlogN),空間復雜度為O(1)---不考慮排序算法的空間復雜度。
三,完整代碼實現

import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class CommonElement { //排序時間復雜度為O(NlogN+MlogM),排序之后尋找公共元素的時間復雜度為O(M+N) public static void printCommonEle(int[] arr1, int[] arr2){ if(arr1 == null || arr2 == null || arr1.length == 0 || arr2.length == 0) return; Arrays.sort(arr1); Arrays.sort(arr2); int i = 0, j = 0; while(i < arr1.length && j < arr2.length) { if(arr1[i] > arr2[j]) j++; else if(arr1[i] < arr2[j]) i++; else{ System.out.print(arr1[i] + " "); i++; j++; } } } //時間復雜度為O(M),空間復雜度為O(N) public static void findCommon(int[] arr1, int[] arr2){ if(arr1 == null || arr2 == null || arr1.length == 0 || arr2.length == 0) return; Set<Integer> intSets = new HashSet<Integer>(); for (int i : arr1) intSets.add(i); for(int i : arr2) if(intSets.contains(i)) System.out.print(i + " "); } public static void main(String[] args) { int[] arr1 = {3,5,1,7,8}; int[] arr2 = {4,7,3,8,5,2,9,0}; printCommonEle(arr1, arr2); System.out.println(); findCommon(arr1, arr2); } }