先把数组B排序,然后用类似外排的方式打印所有不在A中出现的数; 因为可以是会用快速排序对数组 B 进行排序 。所以整体时间复杂度为$O(M*log_2^M)$ 。
具体地, 数组 A 开头放置下标 a,数组 B 开头放置下标 b,比较两个下标指向的值若 b 指向的值 < a 指向的值,则 b++同时打印 b 指向的数,否则a++ , 若等于则a++, b++不打印; 因此整体外排时间复杂度最差O(M+N)。则整个算法时间复杂度为 $O(M*log_2^M) + O(M+N)$ 。
分析: 当 A 数组较短的时候,方法二较好,当 B 数组较短的时候,方法三较好,因为方法三需要对 B 进行排序;
代码实现
方法一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 方法一: 暴力 O(M*N) public List<Integer> getNotInArrays(int[] A, int[] B){ List<Integer> list = new ArrayList<>(); List<Integer> res = new ArrayList<>(); for(int a: A){ list.add(a); } //循环遍历B数组 for(int i = 0; i < B.length; i++){ if(!list.contains(B[i])){ res.add(B[i]); } } return res; }