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