1.两数之和-力扣

166 阅读2分钟

题目

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

链接:leetcode-cn.com/problems/tw…

解析

  • 1.创建Hash表,为遍历记录, 其中遍历的array.value为hash.key, array.index为hash.value
  • 2.遍历, 获取余数值,判断hask.keys中是否包含该数据
  • 3.包含,根据hash表,获取对应的index
  • 4.如果当前index == 余数index return
    func twoSumTest(_ nums: [Int], _ target: Int) -> [Int] {
    var dic: [Int : Int] = [:] //创建字典
    for (index,item) in nums.enumerated() {
        let math = target - item
        //判断是否包含key,想要的是
        if(dic.keys.contains(math)) {
            if let mathIndex = dic[math] , mathIndex != index {
                return [mathIndex , index] 
                //实际上这里的index+1,所以这里的话index 永远大于mathindex
            }
        }
        //第一次遍历时,字典是没有数据的,运行到此位置才给字典添加数据
        //这也是为什么要return[~,index] 能做到的原因
        dic[item] = index
         
    }
    return []
}
//打印
print(twoSumTest([13,2,2,3,4,8], 4))

总结:

  1. 因为第一次写题的原因,刚开始看到这道题的时候一脸懵逼,想了一下,我做的话可能用两次for循环来解题。然后我就去看到评论区的大佬做的题解,确实两次for循环能做出来,但是明显没有上面题解快。
  2. 我用oc写完之后发现,用swift写确实要舒服很多。所以以后我就用swift写了,不必在花费时间用oc在写一遍了。知道其逻辑实现就好了,本来就是用来锻炼我的逻辑思维的。