leetcode刷题笔记1_两数之和

LeetCode第一题:两数之和

前言

从今天开始好好刷leetcode,顺便记录一下,做个笔记。说来惭愧,博主算法书看了好多,但是实战经验还是很欠缺,导致了对算法的研究仅仅停留在了解这种程度,缺乏实战。于是开始了LeetCode刷题之旅,从第一题刷起来~
LeetCode中文官网

题目描述

给定一个整数数列,找出其中和为特定值的那两个数。
你可以假设每个输入都只会有一种答案,同样的元素不能被重用。
示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题目分析

解法一:暴力搜索,暴力法很简单,遍历每个元素 xx,并查找是否存在一个值与 target -x 相等的目标元素。
首先i在数组里循环一轮,在每个i循环下,从剩下的元素找target-nums[i]的值。找到了,就return [i,j]。
解法二:一次for循环
解法三:用字典模拟哈希求解,关于hash table(哈希表),简单来说就是存有键值对key,value的一种数据结构,对于熟悉Python的人来说,常见的字典就是一种hash table。它的查找速度是很快的,可以理解为O(1)。所以这里相当于在解法2的基础上做了一个改进。解法2 是在空间不变的前提下,在i循环时,直接在列表里查找是否含有target-nums[0]的元素,而列表的查找速度是远不如hash table。

代码

解法一:暴力搜索
class Solution(object):
    def TwoSum(self,nums,target):
        lens=len(nums)
        print(lens)
        for i in range(lens):
            num=target-nums[i]
            if num in nums:
                j=nums.index(num)
#               当取得两个下标不一样时,才会停止循环,return
                if i!=j:
                    return [i,j] if i<j else [j,i]
solu=Solution()
print(solu.TwoSum([1,2,3,4],6))

执行结果

解法二:一次for循环
class Solution(object):
    def TwoSum_dict(self,nums,target):
        _dict = {}
        for i, m in enumerate(nums):
            _dict[m] = i

        for i, m in enumerate(nums):
            j = _dict.get(target - m)
            if j is not None and i != j:
                return [i, j]

在这里插入图片描述

解法三:用字典模拟哈希求解
class Solution1(object):
    def TwoSum_dict(self,nums,target):
        _dict = {}
        for i, m in enumerate(nums):
            _dict[m] = i

        for i, m in enumerate(nums):
            j = _dict.get(target - m)
            if j is not None and i != j:
                return [i, j]

hash table查找提升效率,比第一种快了3倍左右。

参考:https://blog.csdn.net/ssswill/article/details/84824667
https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/

注意

需要注意会错的是要判断一下上面代码中i的值和你找到的数组下标值是否相同,比如{324} target = 6, 会不会出现返回 0 0 这种错。
发布了38 篇原创文章 · 获赞 46 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/sk18192449347/article/details/100088060