题目来源https://leetcode.com/problems/two-sum/description/
给定一个数字,输入一个目标值,假设这个目标值等于数组中两个数相加,并且数组中的数字不重复。找到数字中两个数相加等于目标值的数,并返回索引。
解题思路,最容易想到的是两层循环,找到两个相加等于目标值的数,实际开发中第一目标就是实现需求,那么我们就先把这个需求实现一下。
fun twoSum(nums: IntArray, target: Int): IntArray? { for(i in nums.indices){ nums.indices .filter { i != it && nums[i] + nums[it] == target } .forEach { return intArrayOf(i, it) } } return null }
但是这种两层循环嵌套显然不是很理想,那么该如何优化呢?
我们把等式换一种写法,2 + x = 9,如果我们可以只有第一层循环,第二层的循环找值去掉就好了。显然数组的链式结构是做不
到的,接下来很自然的就能想到Map的键值对形式,我们如果将数组中的值作为Map的Key,数组的下标作为Map的value,那么
我们就能去掉第二层循环,最后来看看代码应该怎么写吧。
fun twoSum(nums: IntArray, target: Int): IntArray? { val transformNums = HashMap<Int, Int>() for(i in nums.indices){ //为了避免元素重复使用,所以先取值,再存值 if(transformNums.containsKey(target - nums[i])){ //若找到需要的值,那么直接返回即可 return intArrayOf(i, transformNums[target - nums[i]]!!) } //如果一开始先循环将数组转换为map是得不偿失的,所以只能在循环的过程中,将使用过的值存入map中 transformNums.put(nums[i], i) } return null }
这样,我们就完成了这个算法,如果你们有更好的想法欢迎分享交流。
最后我们测试一下吧,看看运行结果是什么