vb如何判断数组相等_算法是一种艺术!两个数组的交集如何画出来?

我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,关注后回复【资源】,即可获取!更可回复【内推】加入 BAT 内推群!

00e90445e0d265f9016d8ed44009d215.gif

01、题目分析

我们先来看一道题目:

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

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]

输出: [2,2]

示例 2:

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

输出: [4,9]

说明:

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

进阶:

  • 如果给定的数组已经排好序呢?将如何优化你的算法呢?

思路:设定两个为0的指针,比较两个指针的元素是否相等。如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。

02、题解分析

首先拿到这道题,我们基本马上可以想到,此题可以看成是一道传统的映射题(map映射),为什么可以这样看呢,因为我们需找出两个数组的交集元素,同时应与两个数组中出现的次数一致。这样就导致了我们需要知道每个值出现的次数,所以映射关系就成了。剩下的就是顺利成章的解题。

由于该种解法过于简单,我们不做进一步分析,直接给出题解:

//GO
func intersect(nums1 []int, nums2 []int) []int {
    m0 := map[int]int{}
    for _, v := range nums1 {
        //遍历nums1,初始化map
        m0[v] += 1
    }
    k := 0
    for _, v := range nums2 {
        //如果元素相同,将其存入nums2中,并将出现次数减1
        if m0[v] > 0 {
            m0[v] -=1
            nums2[k] = v
            k++
        }
    }
    return nums2[0:k]
}

这个方法比较简单,相信大家都能看的懂!

03、题目进阶

题目在进阶问题中问道:如果给定的数组已经排好序呢?你将如何优化你的算法?我们分析一下,假如两个数组都是有序的,分别为:arr1 = [1,2,3,4,4,13],arr2 = [1,2,3,9,10]

9f5ea60c5c97163a0223af2969b55e02.png

对于两个已经排序好数组的题,我们可以很容易想到使用双指针的解法~

解题步骤如下:

<1>设定两个为0的指针,比较两个指针的元素是否相等。 如果指针的元素相等,我们将两个指针一起向后移动,并且将相等的元素放入空白数组。下图中我们的指针分别指向第一个元素,判断元素相等之后,将相同元素放到空白的数组。

0216e43a4be050ba1f3ecf11c6f8679a.png

<2>如果两个指针的元素不相等,我们将小的一个指针后移。 图中我们指针移到下一个元素,判断不相等之后,将元素小的指针向后移动,继续进行判断。

4969251ec62aca3b96f790a60f829fd0.png

<3>反复以上步骤。

be465c1f18447490d0aefcc81ab188f3.png

<4>直到任意一个数组终止。

027ffe88ca61f95f452ad96d822f7bb8.png

04、题目解答

根据分析,我们很容易得到下面的题解:

//GO
func intersect(nums1 []int, nums2 []int) []int {
 i, j, k := 0, 0, 0
 sort.Ints(nums1)
 sort.Ints(nums2)
 for i len(nums1) && j len(nums2) {
  if nums1[i] > nums2[j] {
   j++
  } else if nums1[i]    i++
  } else {
   nums1[k] = nums1[i]
   i++
   j++
   k++
  }
 }
 return nums1[:k]
}

提示:解答中我们并没有创建空白数组,因为遍历后的数组其实就没用了。我们可以将相等的元素放入用过的数组中,就为我们节省下了空间

下方扫码!1000 本电子书 + 100 张高清思维导图,回复【资源】快速获取!
aff6de85a0a49ce6737e8c6e4e5bafce.png
cce249e8f463dd8be4e0528d87b1c5ba.png 今日论点:

计算机专业真的如此完美吗?

61eb8a12534c326976d461d828dca595.png

不完美,但在目前的市场情况下,计算机行业对于应届生的确是有最多的机会。我们不鼓励每个人都转行,但是如果你在本专业找工作非常困难,不妨考虑一下学习编程技术,试试看能不能转计算机。

至于计算机这活好不好干,挣不挣钱,那就仁者见仁、智者见智了,饭都是一口一口吃的,就看你造化和悟性了。牛逼的人到哪都是牛逼闪闪,你要转行就早转,不转就踏踏实实干本行,只要你行,前途都错不了的。

大家怎么看呢?评论区留下你的想法吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值