Leetcode第一题 两数之和 Python解法

Leetcode第一题《两数之和》( Python解法)

博主本科统计,虽然硕士是计算机专业,现在研二了,这代码水平甚是尴尬,只要能实现功能就ok,性能什么的真的太差了,所以决定从今天起开始刷Leetcode,2天一道,希望可以坚持。

一、题目描述

该题目很简单,题目描述如下图,在此不赘述。
在这里插入图片描述

二、多种解法

2.1 简单粗暴2层循环

class Solution:
    # 最简单粗暴的2层循环遍历,结果就是超时了,想哭
    # 时间复杂度:O(n^2),空间复杂度O(1) 
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    m = [i,j]
                    break
        return m

2.2 改进为1层循环
相对于第一种方法,主要提升在于:将2层for循环替换为1层。没有超时了,但时间复杂度和空间复杂度无本质变化。

class Solution:
    # 只用一遍循环遍历
    # 查找target-nums[left_index]是否在剩余数组里出现
    # 如果找得到,则返回其下标值;反之则说明没有该答案
    # 时间复杂度:O(n^2),空间复杂度O(1) 
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        answer = []
        for left_index in range(len(nums)):
            right = target - nums[left_index]
            if right in nums[left_index+1:]:
                nums_right = nums[left_index+1:]
                right_index = nums_right.index(right) + left_index + 1
                answer.extend([left_index,right_index])
                break
        return answer

提交后的结果,这个用时还是太多。
在这里插入图片描述
2.3 使用dict模拟hash结构
代码如下,空间换时间。

class Solution:
    # 使用dict字典
    # 时间复杂度:O(n),空间复杂度O(n) 
    def twoSum(self, nums:List[int], target:int) -> List[int]:
        re_nums_dict = {}
        for nums_key, nums_value in enumerate(nums):
            re_nums_dict[nums_value] = nums_key
            
        for left_index, left in enumerate(nums):
            right_index = re_nums_dict.get(target-left)
            if right_index != left_index and right_index is not None:
                break
        return [left_index, right_index]

提交答案,时间性能得到飞跃,空间始终没变。。。
在这里插入图片描述

三、反思

从最终的时间和空间复杂度排名可以看到,这个进步空间还是很大的。
等刷到后边题目有了新的想法再回过头来做改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值