两数之和
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()
}