leetcode(1)_Two Sum

题目

1. 我的解答

class Solution(object):
    def twoSum(self, nums, target):

        maps = {}
        for i in range(len(nums)):
            maps.update({str(i):nums[i]})
        def getIndex(values):
            assert len(values) == 2
            print(values)
            if values[0] == values[1]:
                indexes = [i for i ,a in enumerate(maps.values()) if a == values[0]]
                return sorted([int(maps.keys()[indexes[0]]), int(maps.keys()[indexes[1]])])
            else:
                index0  = maps.keys()[maps.values().index(values[0])]
                index1  = maps.keys()[maps.values().index(values[1])]
                return sorted([int(index0), int(index1)])

        sort_nums = sorted(nums)
        nums_small = [x for x in sort_nums if x <= target - sort_nums[0]]

        nums_middle = [x for x in nums_small if x ==  target/2]
        if len(nums_middle) == 2 and nums_middle[0] + nums_middle[1] == target:
            return getIndex(nums_middle)

        nums_left = [x for x in nums_small if x < target/2]
        nums_right = [x for x in nums_small if x > target/2]
        print("l:", nums_left)
        print("r:", nums_right)

        for l in nums_left:
            result = [r for r in nums_right if l+r == target]
            if len(result) == 1:
                result = getIndex([l, target-l])
                return result
        return None

2. 大神的代码

大神写的

class Solution(object):
    def twoSum(self, nums, target):
        nums_dict = dict()
        for i, v in enumerate(nums):
            if v not in nums_dict:
                nums_dict[v] = i
            if target - v in nums_dict:
                k = nums_dict[target - v]
                if k < i:
                    return [k, i]

我的思路是,先保存索引,再排序,然后对半查找,对于6=3+3的情况,需要单独判断。
大神的思路是,在建立索引的时候,同时判断,而且是利用target-v是否在dict的方式,而不是两次遍历求和判断。

3. 差距

  1. 尽量避免重复多个循环,能同时做的事情,绝不分开做。
  2. 当要进行某种遍历时,要选择遍历变量的所在集合尽可能小的方法遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值