350.两个数组的交集II

题目:

在这里插入图片描述

思路:

  • 与上题不同的是,这次要求输出结果中与元素在两个数组中重复出现的次数一致,所以我们采用hashmap<K,V>.K代表num1中元素,V代表nums1中该元素出现的次数
  • 检查数组的大小并对较小的数组进行哈希映射是一个小细节,当其中一个数组较大时,会减少内存的使用。
  • 在这里插入图片描述
    在这里插入图片描述
    注意数组截取的方式(收藏里)
    在这里插入图片描述
  • 1.使用方法:System.arraycopy(源数组名称,源数组开始点,目标数组名称,目标数组开始点,拷贝长度);
  • 可以从任意位置开始截取,并放到任何位置
  • 2.使用方法:java.util.Arrays.copyOf(源数组名称,新数组长度);
  • 说明:从arr1数组中的一部分截取下来定义为一个新的数组.只能从头开始截取.

代码:

class Solution {
    //求两个数组的交集1,力扣350
    public int[] intersect(int[] nums1, int[] nums2) {
    //将较小的数组放到哈希map中去
     if (nums1.length > nums2.length ){
         return intersect(nums2,nums1);
     }
     //上述判断完之后num1就是长度小的数组
        HashMap<Integer,Integer> map = new HashMap<>();
       for (int i:nums1){
          Integer index = map.getOrDefault(i,0);
          map.put(i,index+1);
       }
       //在map中查找nums2的元素
        int k= 0;
       for (int j:nums2){
           //如果j存在则返回j的V,如果j不存在则返回0
           int temp = map.getOrDefault(j,0);
         if (temp > 0){
             //说明nums2中的j元素是存在的
             //将重复元素直接覆盖在nums1上,节省空间
           nums1[k++] = j;
           //将map中j元素的个数减一,意思是他已经被放出去一次
           map.put(j,temp-1);
         }
       }
//       //返回nums1中0-k的元素,不能直接返回num1
//        int [] result = new int[k];
//       int w = 0;
//        for (int t = 0;t<k;t++){
//          result[w++] = nums1[t];
//        }
//       return result;
        //上方法还是新开辟了空间,如果不想重新开辟空间可以使用库中截取数组的方法
        return Arrays.copyOf(nums1,k);
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值