算法練習(4)-數組去重合並


這是日常工程中,經常會遇到的場景,拿到2個list,里面有重復元素,要求去重合並最終排序輸出。

題目:2個數組,比如[1,1,6,8] , [6,8,9,1,10,4],要求合並去重並排序,即最終變成[1,4,6,8,9,10]

 

思路1 :TreeSet

實際java工程中,最直觀的想法,就是利用現成的集合類TreeSet

    public static void main(String[] args) {
        int[] a = new int[]{1, 1, 6, 8};
        int[] b = new int[]{6, 8, 9, 1, 10, 4};

        Set<Integer> set = new TreeSet<>();

        for (int i = 0; i < a.length; i++) {
            set.add(a[i]);
        }

        for (int i = 0; i < b.length; i++) {
            set.add(b[i]);
        }

        System.out.println(set);
        
    }

全扔進去就完事了,但是從算法角度,並非最優題。TreeSet內部是采用HashMap加其它一堆復雜結構完成的。

 

思路2:類似桶排序的空間換時間解法

如果已知數值的大小范圍,比如0-100,可以預選創建一個長度為100的空數組,每個值默認初始為0,下標索引對應0-100之間的數字。把2個數組跑一次,在相應的索引位置位,值+1,相當於做標識,O(N)就能搞定

    public static void main(String[] args) {
        int[] a = new int[]{1, 1, 6, 8};
        int[] b = new int[]{6, 8, 9, 1, 10, 4};

        int[] temp = new int[100];

        for (int i = 0; i < a.length; i++) {
            temp[a[i]] += 1;
        }

        for (int i = 0; i < b.length; i++) {
            temp[b[i]] += 1;
        }

        for (int i = 0; i < temp.length; i++) {
            if (temp[i] > 0) {
                System.out.print(i + "\t");
            }
        }
    }

  

思路3:老老實實的循環遍歷

這是最差解法,只是列下思路,先弄1個新數組(大小為2個數組size合),然后1個個循環,把不重復的依次放入,最后把把前面N個有效值,取出來排序。


免責聲明!

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



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