对于算法而言,生疏而神秘,却是成长经验中必经之路。
已经无数次各种找材料,寻求各种所谓的七天搞定算法秘籍,可后果都是无终而返。
其实换句话来讲,我也是搞 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 号问题:两个数组的交加