LeetCode 1. 两数之和

题目:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9

所以返回 [0, 1]


思路:

方法一:

有2个情况要考虑,一个是正常的a+b=target,另一个是a+a=target。
通过target减去list内部数字,判断是否存在作为过滤条件
1)index数量大于等于2,index相同的元素不能使用2次
2)为了保证顺序,减数的index要比当前的i值大。
最后把index就存到新的list里面即可

class Solution(object):
   def twoSum(self, nums, target):
       list = []
       i = 0
       while i < len(nums):
           while target-nums[i] in nums:
               if nums.count(target-nums[i])>=2:
                   if len(list) ==2:
                       break
                   else:
                       list.append(i)
               else:
                   if nums.index(target-nums[i])>i:
                       list.append(i)
                       list.append(nums.index(target-nums[i]))
               break
           i +=1
       return list

--执行结果
执行用时 :1232 ms, 在所有 Python 提交中击败了38.06%的用户
内存消耗 :13.4 MB, 在所有 Python 提交中击败了6.17%的用户

方法二:

因为方法一的用时相对有些多,所以参考大牛们的意见采用key value的字典模拟hashmap去筛选过滤。
字典依次遍历按照value index的方式存入新的dic,当遍历dic找到target - value的值时返回当前dic中保存符合的index和当前的index,即符合题目要求

class Solution(object):
def twoSum(self, nums, target):
    dic = {}
    for i, value in enumerate(nums):
        if target - value in dic:
            return [dic[target - value], i] 
        dic[value] = i

执行用时 :36 ms, 在所有 Python 提交中击败了73.27%的用户
内存消耗 :14.3 MB, 在所有 Python 提交中击败了6.17%的用户

总结:

本以为这个题目很简单,没想到花了我不少时间去思考用时问题,第一时间想起来的方式就是通过列表去做这个事情,没想到用dic 更省时间,下决心要好好刷leet code练习自己的解题思路还有时间算法处理能力,加油。

posted @ 2020-05-07 09:56  萧蔷ink  阅读(110)  评论(0编辑  收藏  举报