349.两个数组的交集

在这里插入图片描述
做法基本两种

  • 一是用java的set来做
  • 二是用排序+二分/双指针来做

实现2

排好序了,可以比较下两个数组的最大值,最小值,看看是否有解,在大量数据的时候可以剪枝。

	  int max1,max2,min1,min2;
      if(nums1.length==0||nums2.length==0) return new int[0];
      max1=nums1[nums1.length-1];//看到长度-1,考虑是否越界
      min1=nums1[0];
      max2=nums2[nums2.length-1];
      min2=nums2[0];
      if(max1<min2||min1>max2) return new int[0];

双指针

class Solution {
    
    
    public int[] intersection(int[] nums1, int[] nums2) {
    
    
      Arrays.sort(nums2);
      Arrays.sort(nums1);
      int[] ans=new int[nums2.length];
      int cot=0;
      int j=0;
      int i=0;
      while(i!=nums1.length){
    
    
          if(j==nums2.length) break;
          if(nums1[i]==nums2[j]){
    
    
              j++;
              if(cot>=1&&nums1[i]==ans[cot-1]){
    
    
                  i++;
                  continue;
              }
              ans[cot++]=nums1[i];
          }else if(nums1[i]>nums2[j]) j++;
          else if(nums1[i]<nums2[j]) i++;
      }
      return Arrays.copyOf(ans,cot);
    }
}

二分

两个数组已经排序了,可以用二分了。
无非是遍历一个数组,在另一个数组中二分。


实现1

class Solution {
    
    
    public int[] intersection(int[] nums1, int[] nums2) {
    
    
        Set<Integer> s1=new HashSet<>();
        Set<Integer> s2=new HashSet<>();
        for(Integer am:nums1) {
    
    
            s1.add(am);
        }
        for(Integer am:nums2) s2.add(am);
        int size=Math.max(s1.size(),s2.size());
        int[] ans=new int[size];
        int index=0;
        for(Integer am:s1){
    
    
            if(s2.contains(am)){
    
    
                ans[index++]=am;
            }
        }
        return Arrays.copyOf(ans,index);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43179428/article/details/106883743
今日推荐