这个题自己做到最后总是时间超限,分析应该是代码中的一个很多余的while循环浪费了时间,看了一下别人的解法稍微改动了结构,然后就通过了。
思路是先用java中sort排序,两个数组都从小到大,然后两个数组都从小到大逐位比较即可,注意因为已经排序的关系,不会倒回去比较,只会一直往数值大的方向比较,具体看代码即可理解。时间复杂度是sort函数的(n*logn)。一方数组的长度很小的话,可以很快算完,所以比较快。
源码:
import java.util.*;
import java.util.Arrays;
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int len1=nums1.length;
int len2=nums2.length;
ArrayList result=new ArrayList();
int i=0,j=0;
while(i<len1&&j<len2){
if(nums1[i]==nums2[j]){
result.add(nums2[j]);
i++;
j++;
}
else if(nums1[i]<nums2[j])
i++;
else
j++;
}
int len3=result.size();
int []a=new int[len3];
int q=0;
for(Object k:result){
int p=(int)k;
a[q]=p;
q++;
}
return a;
}
}
while循环里应该是很简单的分支结构,我一开始没想清,在里面还加了一个多余的while循环,当nums1[i]<nums2[j]是一直i++,其实完全可以用if语句处理的。这个小的点今后注意。
另外一开始写的版本是函数调用的,觉得代码很冗余,不用分开考虑两个数组的长短问题,放到一起一个while循环就可以解决。
【本题解法持续整理中........】
参考博客:
https://blog.csdn.net/xushiyu1996818/article/details/81416281