查找兩個整型數組的公共元素


一,問題描述

給定兩個整型數組,假設一個長度為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);
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM