youlitaiGLZ的LeetCode刷题笔记1

1.两数之和

题目描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。


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

题目解法:
1.首先想到暴力解法,两层循环遍历所有的数字组合情况,得到符合要求的一组解对应的数字下标组合。这种方法的时间复杂度为O( n 2 n^2 n2),效率较低,有一定超时风险。空间复杂度为O(1)。
2.为了优化时间复杂度,想到运用hash表的方法记录数字的索引。这样只需要循环两边:第一遍循环nums数组将数字和对应下标记录在hash表中,第二次循环判断另一个加数(target-当前数字)是否存在于hash表中。这样时间复杂度为O(n),空间复杂度O(n)。
3.以上方法可以再次优化。仅做一次循环,循环时判断当前数字的另一加数是否在表中,如果在则输出答案,如果不在则将当前数字和索引记录入hash表。这样做的时间复杂度为O(n)(因为少了一次循环,可以认为是从2n优化到n),空间复杂度为O(n)(这样在最差情况下需要n的空间,而方法2中必定需要n空间,空间复杂度上也有优化)


代码
本题我使用了python作为编程环境,使用python中的字典构建hash表。

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        sumdict = {}
        for i in range(len(nums)):
            another_num = target - nums[i]
            if another_num in sumdict:
                return [sumdict[another_num],i]
            sumdict[nums[i]] = i

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值