每日一道算法题 - 求两个数组交集

问题

给定两个数组,求两个数组的交集,并以数组形式输出。

思路

1)先排序再比较:先对两个数组进行排序,遍历两个数组中的值并比较,如果相同,则将该值放入集合中。如果不同,则较小值的下标自增并继续比较.
2)通过map进行记录:key为集合中的具体值,value为该值在集合中出现的次数。 先遍历nums1,并将值添加到map中,接着遍历nums2, 判断遍历得到的nums2中的每一个值是否在map中,如果在map中则添加到集合中。

实现

1)先排序再比较

public class InterSect {

    public static void main(String[] args) {

        int[] nums1 = new int[]{4,9,5};
        int[] nums2 = new int[]{9,4,9,8,4};

        int[] result = interSect(nums1,nums2);

        System.out.println(Arrays.toString(result));
    }

    private static int[] interSect(int[] nums1, int[] nums2) {

        /**
         * 对数组排序
         * 对两个数组中的值进行逐一比较,相同放入集合,
         * 如果nums1[i]<nums2[j] ->i++
         * 如果nums1[i]>nums2[j] ->j++
         */
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;
        int j = 0;
        List<Integer> list = new ArrayList<>();

        while (i<nums1.length && j<nums2.length){

            if (nums1[i] == nums2[j]){
                list.add(nums1[i]);
                i++;
                j++;
            }else if (nums1[i]<nums2[j]){
                i++;
            }else if (nums2[j]<nums1[i]){
                j++;
            }
        }

        return list.stream().mapToInt(Integer::intValue).toArray();

    }
}
image.png

2)通过map记录

private static int[] interSect2(int[] nums1, int[] nums2) {
        //key 值  value 出现的次数
        Map<Integer,Integer> map = new HashMap<>();
        List<Integer> list = new ArrayList<>();

        //遍历nums1
        for (int i=0;i<nums1.length;i++) {
            map.put(nums1[i],map.getOrDefault(nums1[i],0)+1);
        }

        //遍历nums2
        for (int i=0;i<nums2.length;i++) {
            if (map.getOrDefault(nums2[i],0)>0){
                list.add(nums2[i]);
                map.put(nums2[i],map.getOrDefault(nums2[i],0)-1);
            }
        }

        return list.stream().mapToInt(Integer::intValue).toArray();
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容