两数之和


class Solution {
    fun twoSum(nums: IntArray, target: Int): IntArray {
        var results = IntArray(2)
        var result: Int
        var complement: Int
        val map = HashMap()

        nums.forEachIndexed { index, value ->
            map[value] = index
        }

        nums.forEachIndexed { index, value ->
            result = target - value
            if (map.containsKey(result)) {
                complement = map[result]!!
                if (complement != null && complement != index) {
                    results[0] = complement
                    results[1] = index
                }
            }
        }
        return results
    }
}

上述方法比较容易理解。大致的思路是使用一个map集合存储数组,然后循环数组中的每一个数,把目标值与当前循环数组中的数字做差,最后去map集合中去寻找该数。若找到,则说符合要求,返回下标。否则,继续寻找。

点评:上述方法代码逻辑清晰,但是结构比较混乱,且创建了多个对象,造成不必要的内存浪费。

参考了其他同学的答案,上述思路可以优化成:

fun other(nums: IntArray, target: Int): IntArray {
    val results = mutableMapOf()
    nums.forEachIndexed { index, value ->
        results[target - value]?.run {
            return intArrayOf(this, index)
        }
        results[value] = index
    }
    return intArrayOf()
}