1. 一个错误的思路:用小的那个数组,逐个扫描大的数组,如果存在,就加入新Arraylist。但是,这个算法有个很严重的问题,没有考虑次数
比如:
{3,1,2}
{1,1}
这样输出的是{1,1},但是结果是{1},所以,这个不行:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1=nums1.length;
int len2=nums2.length;
if(len1>len2){
return comp(nums1,nums2);
}else{
return comp(nums2,nums1);
}
}
public int[] comp(int[] arr_big,int[] arr_small){
ArrayList<Integer> al=new ArrayList<Integer>();
for(int i=0;i<arr_small.length;i++){
for(int j=0;j<arr_big.length;j++){
if(arr_small[i]==arr_big[j]){
al.add(arr_small[i]);
break;
}
}
}
int[] result=new int[al.size()];
for(int i=al.size()-1;i>=0;i--){
result[i]=al.get(i);
}
return result;
}
}2.先各自排序(如升序),然后用两个指针,比较两个数组,小的那个,往前走,继续比较,这样的目的是,升序后,后面的数比前面的大,如果其中一个数组前面的数已经都比另一个数组现在指针的数值小了,就应该往后走了。
例如:
{1,1,1,2,3,4,5,6,7,8} index
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if(nums1.length==0||nums2.length==0){
int[] nu={};
return nu;
}
Arrays.sort(nums1);
Arrays.sort(nums2);
ArrayList<Integer> ls=new ArrayList<Integer>();
int index1=0;
int index2=0;
while(true){
if((index1>=nums1.length)||(index2>=nums2.length)){
break;
}
if(nums1[index1]==nums2[index2]){
ls.add(nums1[index1]);
index1++;
index2++;
}else if(nums1[index1]<nums2[index2]){
index1++;
}else{
index2++;
}
}
int size=ls.size();
int[] result=new int[size];
for(int i=0;i<size;i++){
result[i]=ls.get(i);
}
return result;
}
}{3,4,5,6,7} index B
那么,如果index A所指的数比indexB的小,(比如,A-》3,B-》4),那就只有可能和B所相同的数在A往后走了
3.思路,考虑次数,就先把其中一个数组存入表,值是键,次数为表的值;
用另一个数组扫描,有的话就加入结果中,并且把次数减一。另外,因为代码中需要返回null,整数是不能赋值null的,所以需要Integer才行,注意哟
另外,有一个注意,就是map取出来的值,有可能是0,有可能是null,所以和数值或者null对比的时候,容易有问题;
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
for(int i=0;i<nums1.length;i++){
//注意,一定要用Integer,因为对象才有null,int是没有null的
Integer value=map.get(nums1[i]);
map.put(nums1[i],(value==null?1:value+1));
}
ArrayList<Integer> al=new ArrayList<Integer>();
for(int i=0;i<nums2.length;i++){
//这里可能有一个问题,就是map.get(nums2[i])有可能是null(数组为空),有可能是0,但是null!=0这个判断是有问题的。所以,
//要不然就从一开始排除空数组情况,要不然就map.containsKey(nums2[i])把这个放在前面,短路&&后面的
//的表达式
if(map.containsKey(nums2[i])&&map.get(nums2[i])!=0){
if(map.get(nums2[i])!=0){
al.add(nums2[i]);
map.put(nums2[i],map.get(nums2[i])-1);
}
}
}
int size=al.size();
int[] result = new int[size];
for(int i=0;i<size;i++){
result[i]=al.get(i);
}
return result;
}
}

本文探讨了三种求解两个数组交集的有效算法:错误的直接匹配方法、排序后的双指针法以及利用哈希表计数的方法。每种方法都有详细的解释和对应的Java代码实现。
430

被折叠的 条评论
为什么被折叠?



