1.Two Sum

题目来源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
    }

这样,我们就完成了这个算法,如果你们有更好的想法欢迎分享交流。

最后我们测试一下吧,看看运行结果是什么



猜你喜欢

转载自blog.csdn.net/z89135898/article/details/79137093