Python3学习笔记37-LeetCode刷题

LeetCode中国官网一个用来刷编程题的网站,收录了很多面试题。感觉还是学习到很多。记录一下思路。代码还是要多敲。

建议编写完后直接在LeetCode上运行和提交。提交时会有不同的测试用例来测试代码。可以查遗补漏。

 

1)两数之和

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

最简单的直接两个循环暴力解决。

class Solution(object):
    def twoSum(self, nums, target):
        num = len(nums)
        for i in range(num):
            for j in range(i+1,num):
                if nums[i] + nums[j] == target:
                    return [i,j]

if __name__ == '__main__':
    n = [3,2,4]
    tar = 6
    s = Solution()
    a = s.twoSum(n,tar)
    print(a)

没有啥可多说的,就是第一层循环所有,第二层从第一层所在的下标后一位开始。然后相加看是不是等于某个值,然后返回下标。在LeetCode提交时候,提示用时4172ms

之后看到官方和别人的解题思路,可以使用字典来提高效率class Solution(object):

def twoSum(self, nums, target):

        nub = len(nums)
        dict1 = {}
        for i in range(nub):
            value = target - nums[i]
            if value in dict1:
                return [dict1[value],i]
            dict1[nums[i]] = i

if __name__ == '__main__':
    n = [3,2,4]
    tar = 6
    s = Solution()
    a = s.twoSum(n,tar)
    print(a)
思路是将数组的值当做字典的键,数组的下标当做字典键。循环 i 就是数组当前值得下标。求合值减去当前值,算出另一个数的值。如果这个值是字典里存在的键。就返回键在字典中对应的值,和 i 。最后是将数组的值添加到字典里面。用时56ms

需要注意的是,一定要先判断一轮,再将值写入字典。以上图为例,如果先写入字典。下标0的时候,值是3。另一个需要的数也是3.这时候去字典里找第一个就是3.输出就会是[0, 0] ,但是正确的应该是[1, 2]。

posted @ 2019-05-08 13:48  梦忆安凉  阅读(347)  评论(0编辑  收藏  举报