【LeetCode-简单题】350. 两个数组的交集 II

题目

在这里插入图片描述

方法一:哈希表

  1. 用哈希表记录第一个数组的每个数和每个数的出现次数
  2. 再遍历第二个数组,如果哈希表中有这个数,并且次数还不为0,说明是交集元素,加入结果集,(并且让该数的次数-1)如果哈希表右这个元素,但是次数为0 了,就不能加入结果集了。若遇到哈希表没有的数,直接跳过

参考链接两个数组的交集 II

class Solution {
    
    
    public int[] intersect(int[] nums1, int[] nums2) {
    
    
        Map<Integer,Integer> map = new HashMap<>();
        List<Integer> res = new ArrayList<>();
        for(int i : nums1){
    
    
            if(!map.containsKey(i)) map.put(i,1);
            else map.put(i,map.get(i)+1);
        }
        for(int i : nums2){
    
    
            if(!map.containsKey(i)) continue;
            else if(map.get(i) > 0){
    
    
                map.put(i,map.get(i)-1);
                res.add(i);
            }
        }
        int[] array = new int[res.size()];
      for (int i = 0; i < res.size(); i++) {
    
    
              array[i] = res.get(i);
        }
        return  array;
    }
}

方法二:双指针

  1. 首先就是要对两个数组进行排序
  2. 然后再根据指针进行循环比较,若相等,则记录位置元素到结果集,如果其中一个大于另一个。那就移动小的一方的指针,再比较,直到一方的指针走完自己的数组长度了

在这里插入图片描述

class Solution {
    
    
    public int[] intersect(int[] nums1, int[] nums2) {
    
    
      Arrays.sort(nums1);
      Arrays.sort(nums2);
      List<Integer> list = new ArrayList<>();
      int nums1len  = 0;
      int nums2len  = 0;
      while(nums1len < nums1.length && nums2len < nums2.length){
    
    
          if(nums1[nums1len]==nums2[nums2len]) {
    
    
              list.add(nums1[nums1len]);
              nums1len++;
              nums2len++;
          }else if(nums1[nums1len] > nums2[nums2len]) nums2len++;
           else nums1len++;
      }
      int[] res = new int[list.size()];
      int i = 0;
      for(int j : list) 
      res[i++] = j;

      return res;
      
      }
}

猜你喜欢

转载自blog.csdn.net/weixin_45618869/article/details/132857889
今日推荐