美文网首页
【数组】350. 两个数组的交集II Easy

【数组】350. 两个数组的交集II Easy

作者: ___Qian___ | 来源:发表于2019-01-13 16:21 被阅读0次

题目

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

思路

  1. 使用Map记录nums1中的数字情况,Key为值,Value为出现的次数
    然后遍历nums2中的每个数值num:
    若map.containsKey(num) && map.get(num) > 0,则将该值记录至List中,次数-1;
    否则遍历下一个
    时间复杂度O(n)
class Solution {
   public int[] intersect(int[] nums1, int[] nums2) {

        HashMap<Integer, Integer> record = new HashMap<Integer, Integer>();
        for(int num: nums1)
            if(!record.containsKey(num))
                record.put(num, 1);
            else
                record.put(num, record.get(num) + 1);

        ArrayList<Integer> result = new ArrayList<Integer>();
        for(int num: nums2)
            if(record.containsKey(num) && record.get(num) > 0){
                result.add(num);
                record.put(num, record.get(num) - 1);
            }

        int[] ret = new int[result.size()];
        int index = 0;
        for(Integer num: result)
            ret[index++] = num;

        return ret;
    }

}
  1. 对数组排序,然后使用双指针遍历两个数组
    时间复杂度O(nlogn)
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<>();     
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;
        int j = 0;
        while (i < nums1.length && j < nums2.length) {
            if (nums1[i] < nums2[j]) {
                i++;
            } else if (nums1[i] > nums2[j]) {
                j++;
            } else {
                list.add(nums1[i]);
                i++;
                j++;
            }
        }
        int[] result = new int[list.size()];
        int k = 0;
        for (Integer num : list) {
            result[k++] = num;
        }
        return result;
}
}

相关文章

网友评论

      本文标题:【数组】350. 两个数组的交集II Easy

      本文链接:https://www.haomeiwen.com/subject/iaskdqtx.html