查找兩個數組中的相同元素---Java

思考後想出來兩種方法,第一種在兩個數組中,每個數組不能存在重複元素,那麼可以直接暴力循環,複雜度爲爲O(n2),而且這種方法只能適用於arr1和arr2各自中不存在重複元素。

public static List<Integer> findSame(int[] arr1, int[] arr2) {
        List<Integer> list = new ArrayList<>();
        if (arr1 == null || arr2 == null || arr1.length == 0 || arr2.length == 0) {
            return list;
        }
        for(int i=0;i<arr1.length;i++) {
            for(int j=0;j<arr2.length;j++)
                if(arr1[i]==arr2[j]) {
                    list.add(arr1[i]);
                }
        }
        return list;
    }

歸併的思想,複雜度爲O(M+N),M和N分別爲兩個數組的長度,所以這種方法效率是比暴力法高很多,但是前提是有序,如果不有序,那麼先對其進行排序,排序複雜度爲排序的O(nlogn),加起來複雜度肯定還是高於O(n2),而且此種方法適用於兩個數組存在重複元素的情況。

這種方法設置兩個數組指針,在相等的時候同時後移,如果不相等,誰小誰++,你追我趕,遍歷完任何一個數組,那麼就可以結束。

    public static List<Integer> findCommon(int[] arr1, int[] arr2) {
        List<Integer> list = new ArrayList<>();
        if (arr1 == null || arr2 == null || arr1.length == 0 || arr2.length == 0) {
            return list;
        }
        Arrays.sort(arr1);
        Arrays.sort(arr2);
        int i = 0, j = 0;
        while ( i < arr1.length && j < arr2.length ) {
            if (arr1[i] == arr2[j]) {
                list.add(arr1[i]);
                i++;
                j++;
            } 
            else if (arr1[i] < arr2[j]) i++;
            else j++;
        }
        return list;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章