LeetCode-初级算法-两个数组的交集

10 篇文章 0 订阅
10 篇文章 0 订阅

运行结果

在这里插入图片描述

一、题目

在这里插入图片描述

二、分析

题目中有一个很重要的提示:可以不考虑输出结果的顺序,也就是说我们可以将给定数组中的元素进行排序,因为排序之后进行数组变得有规律,两个数组的比较也就相对容易了
步骤:
1、数组题目的第一步仍然是排除数组为空的情况,在本题中,如果任意一个数组为空,那么返回值一定是一个空数组。
2、使用Arrays的静态方法sort 对两个数组进行升序排序
3、同时取两个数组中的值进行比较,分别使用 i 和 j 作为两个数组的下标。比较nums1 [i] 和nums2 [j]的值。结果有三种情况:①nums1 [i] > nums2 [j] ②nums2 [j] > nums1 [i] ③nums1 [i] = nums2[j]
由于两个数组都经过了升序排列,所以对于三种结果我们分别做如下操作:

  • ①.nums1 [i] > nums2 [j],说明此时nums1 [i] 的值比 nums2 [j]大,此时并不能说明nums1 [i] 或者 nums2[j] 在两个数组中是否都存在,数组是排好序的,所以nums2 [j] 之后的元素一定大于等于nums2 [j]。或许nums2 [j] 之后有和nums1 [i] 相等的元素,也或许没有,我们都需要去进行比较,所以应该将 j 的值自增,进行下一次比较。
  • ②. 与第一种情况类似,将 i 的值自增进行下一次比较。
  • ③. 此时nums1 [i] = nums2 [j],这个值就是我们要找的值,此时我们将这个值放在nums1数组的第k位(也可以放在nums2中,目的是为了减少空间的使用)然后将k的值自增,方便下一个元素的存储。因为返回值是连个数组的交集,所以返回值的个数一定 <= nums1的个数,不会影响结果。

4、循环终止的条件是任意一个数组比较到最后一个。
5、返回值:使用Arrays的静态方法copyOf将nums1数组的前k个元素复制到一个新数组并作为返回值

三、源码

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        if(0 == nums1.length || 0 == nums2.length){
            return new int[]{};
        }
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i = 0;
        int j = 0;
        int k = 0;
        while(i < nums1.length && j < nums2.length){
            if(nums1[i] > nums2[j]){
                j++;
            }else if(nums2[j] > nums1[i]){
                i++;
            }else{
                nums1[k++] = nums1[i];
                i++;
                j++;
            }
        }
        return Arrays.copyOf(nums1,k);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值