LeetCode笔记

【LeetCode】两个数组的交集

2019-10-24  本文已影响0人  幽泉流霜

两道题
给定两个数组,编写一个函数来计算它们的交集。

题目1#

示例 1:

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

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

输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。

题目2#

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

两题的区别在于一个不保留原数组出现的次数,另一个则保留
对于第一次我们可以使用HashSet ,HashSet可以自动帮你去重
第二个则使用HashMap ,用Map中的value来记录数字书出现的次数。

题目1##

因为函数的入口是两个int数组类型的
所以我们索性写一个Set入口的函数
然后把int仿佛Set后调用自写的Set函数
最后返回一个int数组即可
要注意的一点是set的长度和最后要返回的交集数组的长度不一致
所以要调用Array的copyOf的方法

package LeetCode_test;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Intersection {
    public static void main(String[] args) {

    }
    public static int[] Prepare_intersection(Set<Integer> num1, Set<Integer> num2) {
        int[] output =new int[num1.size()];
        int m = 0 ;

        for(Integer i :num1){
            if(num2.contains(i)){
                output[m++] = i;
            }//在num1种循环 如果num2中存在这个数则把这个数字加入到交集数组output的中
        }
        return Arrays.copyOf(output,m);
    }
    public static int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> num1 = new HashSet<>(nums1.length);
        for(int i :nums1){
            num1.add(i);//放入Set1
        }
        Set<Integer> num2 = new HashSet<>(nums2.length);
        for(int i : nums2){
            num2.add(i);//放入Set2
        }
        return Prepare_intersection(num2,num1);
    }
}

题目2##

思路:
分别设立一个HashMap和ArrayList
将数组1 放入到HashMap中
有几个数组则它的value就是几
把数组2在HashMap中遍历
如果存在数组2中的值则把它加入到list中
并且将value减一 一旦减到0就说明数组一中也不包含这个数了
所以在map中删除

ps:这里我曾经的想法是判断map中value大小
跟从小的那个。但是这样子会非常麻烦。
题解中直接用了减法 也就是说只用了一个value
这种减法对比 而不是仅仅通过正面条件的判断值得学习。

package LeetCode_test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class InsectionII {
    public static void main(String[] args) {

    }
    public static int[] intersect(int[] nums1, int[] nums2) {
        HashMap<Integer,Integer> Hm = new HashMap<>();
        List<Integer> lt = new ArrayList<>();
        for(int i:nums1){
            if(!Hm.containsKey(i)){
                Hm.put(i,1);
            }//如果不存在key则加入到map中
            else  Hm.put(i,Hm.get(i)+1);
        }//如果存在就把它的value+1
        for(int i : nums2){
            if(Hm.containsKey(i)){
                lt.add(i);
                Hm.put(i,Hm.get(i)-1);
                if(Hm.get(i) == 0 ){
                    Hm.remove(i);
                }//map中包含了这个数就加入到list中 通过value来判断是否继续加入到map中
            }
        }
//list中的即为最后返回的数组
        int[] res = new int[lt.size()];
        for(int i = 0 ; i<res.length;i++){
            res[i] = lt.get(i);
        }
        return res;
    }
}

上一篇下一篇

猜你喜欢

热点阅读