這是日常工程中,經常會遇到的場景,拿到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個有效值,取出來排序。