乐趣区

关于kotlin:算法-Notes-|LeetCode-349-两个数组的交集-easy

对于算法而言,生疏而神秘,却是成长经验中必经之路。

已经无数次各种找材料,寻求各种所谓的七天搞定算法秘籍,可后果都是无终而返。

其实换句话来讲,我也是搞 Android 的,有时候看到所谓 7 天让你成为 Android 大牛,也是等闲视之的。没有久远的积攒,哪儿来的大牛?已经折腾很久的货色,现在 easy 一批,说白了,还是工夫久了,写的多了。

一个人,难免会走进各种误区。经验了职场 PUA,顿悟过去,别无他求,自我积攒为上。

还是鸡老大的那句话:

  • Just do it now.

送给屏幕前的你我,共勉。

针对算法,将采取暴力 Study 法,勤能补拙!多学多练。

集体是个算法白痴,尽量欠缺每一步,不足之处,欢送吊打~

欢送各位大佬吊打~

附上 GitHub 地址:

  • https://github.com/HLQ-Strugg…

349. 两个数组的交加

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

示例 1:

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

示例 2:

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

 
阐明:

  • 输入后果中的每个元素肯定是惟一的。
  • 咱们能够不思考输入后果的程序。

交加概念回顾

以上图为例,A、B 之间重合局部为交加 C。

例如,现有 A、B 如下:

  • A:1 3 4 5 6
  • B:2 3 3 4

重合局部的内容为:

  • 3 4

可得出交加 C 等于 3 4。

交加的概念,用大白话的形式就是,你有我也有,这是交加。此处衍生并集则是,你的加我的,去掉反复的,就是并集。

解题思路 一、Set + contains

大略思路如下:

  • 对于输出型数据根本校验,这里不过多解释;
  • 通过 Set 惟一个性,过滤第一个数组;
  • 将第一个过滤好的数组和第二个数组进行比照,蕴含,则代表重合,增加 Result 中;
  • 遍历 Reslut,赋值 return array

代码如下:

class Solution {fun intersection(nums1: IntArray, nums2: IntArray): IntArray {if(nums1.isEmpty() || nums2.isEmpty()){return IntArray(0)
        }
        var tempSet = hashSetOf<Int>()
        var resultSet = hashSetOf<Int>()
        for(num1 in nums1){tempSet.add(num1)
        }
        for (num2 in nums2){if(tempSet.contains(num2)){resultSet.add(num2)
            }
        }
        var resultIntArray = IntArray(resultSet.size)
        var index = 0
        for(resultNum in resultSet){resultIntArray[index++] = resultNum
        }
        return resultIntArray
    }
}

耗费状况:

解题思路 二、Kotlin intersect()

class Solution {fun intersection(nums1: IntArray, nums2: IntArray): IntArray {if(nums1.isEmpty() || nums2.isEmpty()){return IntArray(0)
        }
        return nums1.intersect(nums2.asList()).toIntArray()}
}

耗费状况:

相比原始的第一种计划,执行用时以及内存耗费均减少不少,比照代码后,此形式减少了两次转 List 操作。

解题思路 三、持续优化第二条

下面说到,因为屡次转 List,造成了肯定的耗费,那么接下来,我少创立下,顺便简化下代码呢?

class Solution {fun intersection(nums1: IntArray, nums2: IntArray): IntArray {if(nums1.isEmpty() || nums2.isEmpty()){return IntArray(0)
        }
        return nums1.intersect(nums2.asList()).toIntArray()}
}

耗费状况:

有点难堪咯。

解题思路 四、学习下排序 + 双指针

参考题解:

  • [多解法解两个数组的交加 [Persian Leopard]](https://leetcode-cn.com/probl…

先附上代码局部:

class Solution {fun intersection(nums1: IntArray, nums2: IntArray): IntArray {if(nums1.isEmpty() || nums2.isEmpty()){return IntArray(0)
        }
        var i = 0
        var j = 0
        var index = 0
        var resultSet = hashSetOf<Int>()
        // 排序的目标是为了上面双指针挪动时数据有迹可循,有法则可循
        nums1.sort()
        nums2.sort()
        // 双指针范畴不得超出输出数组长度
        while (i < nums1.size && j < nums2.size){
            // 要害是这块逻辑判断,各位认真画图,很容易了解了
            if(nums1[i] == nums2[j]){resultSet.add(nums1[i])
                i++
                j++
            }else if(nums1[i] < nums2[j]){i++}else if(nums1[i] > nums2[j]){j++}
        }
        var resultArray = IntArray(resultSet.size)
        for (resultNum in resultSet){resultArray[index++] = resultNum
        }
        return resultArray
    }
}

耗费水平:

End

单纯的从上图后果来看,还是第一次通过 Set + contains 效率最高。对于双指针这块,尽管是画了很长时间图,连忙还是了解差点意思。

仿佛模摸糊糊感触到了算法的重要性,换句话而言的话,也就是算法的思维吧。

不过整体蛮开心的,好歹也算是人生意义上首次搞定啦~

欢送大佬吊打~

路漫漫其修远兮,吾将上下而求索。

参考资料

  • 小浩算法 两个数组的交加 (350)
  • LeetCode 349. 两个数组的交加
  • LeetCode 第 349 号问题:两个数组的交加
退出移动版