搜了好多文章,发现代码是错的,没有达到去重的目的,而且还有人点赞,你们看代码难道不自己测一下看对不对吗?下面是我写的代码,代码看起来长,可能确实有点冗余,但是容易理解,如果有错或者可以优化,麻烦你指出来,可以共同学习,谢谢。
题目要求:数组A,B有序,要求合并A,B,并且去除重复元素。
下面代码实现的复杂度,设A和B的数组长度为M和N那么时间复杂度为O(M+N),如果中用数组实现,空间复杂度也为O(M+N)
public class Solution {
public static void main(String[] args) {
int[] A = {1,2,3,4,5};
int[] B = {1,2,2,3,4,5,5,6,7,7};
int[] result = Solution.multiply(A, B);
System.out.println(Arrays.toString(result));
}
public static int[] multiply(int[] A,int[] B) {
if (A == null && B == null || A.length < 1 && B.length < 1) {
return null;
}
// 创建辅助集合,其实数组创建新的数组也行,new int[A.length+B.length]
List<Integer> list = new ArrayList<>();
int index = 0, p1 = 0, p2 = 0;
// 先将A或者B中的首个元素添加到list
// 这里其实得判断是否为null。
list.add(A[p1++]);
// 当没有遍历完A和B中任意一个数组时执行
while ( p1 < A.length && p2 < B.length ) {
// 拿到当前指针的最小值
int tmp = A[p1] < B[p2] ? A[p1++] : B[p2++];
// 判断list中是否已经添加了此元素
if (tmp > list.get(index)) {
list.add(tmp);
// 每次添加元素后指针后移
index++;
}
}
// 当B中元素添加完,只剩A中元素时
while ( p1 < A.length ) {
int tmp = A[p1++];
if (tmp > list.get(index)) {
list.add(tmp);
index++;
}
}
// 当A中元素添加完,只剩B中元素时
while ( p2 < B.length ) {
int tmp = B[p2++];
if (tmp > list.get(index)) {
list.add(tmp);
index++;
}
}
// 将list中元素重新移回到数组,如果刚开始创建的是数组,那么就不用这一步了
int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
}