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

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

其实换句话来讲,我也是搞 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 号问题:两个数组的交加