LeetCode_Everyday:001 Two Sum

LeetCode_Everyday:001 Two Sum


LeetCode Everyday:坚持价值投资,做时间的朋友!!!

题目:

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

示例:

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

代码

方法一: 暴力枚举法,时间复杂度: O ( n 2 ) O(n^2) O(n2)

执行用时 :6812 ms, 在所有 Python3 提交中击败了5.96%的用户
内存消耗 :14.7 MB, 在所有 Python3 提交中击败了12.80%的用户

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """   
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] + nums[j] == target:
                    return[i, j]
                
"""
For Example:    input:   nums = [2, 7, 11, 15]  target = 9
               output:   [0, 1]
"""             
nums = [2, 7, 11, 15]
target = 9

solution = Solution()
result = solution.twoSum(nums, target)
print('输出为:', result)    # [0, 1]

方法二: 两边找法,时间复杂度: O ( n ) O(n) O(n)

Tips: 需要注意的是使用这种方法的前提是列表有序(本题无序),无序可以先排序,但是排序之后需要找回原来的index,可以建立一个映射关系,所以如果只是针对此题,不建议使用,但是这种思路很好,对于有序列表且多维度搜索有奇效。


class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        i = 0
        j = len(nums) - 1
        while i < j:
            sum = nums[i] + nums[j]
            if sum == target:
                return [i ,j]
            elif sum < target:
                i += 1
            else:
                j -= 1

"""
For Example:    input:   nums = [2, 7, 11, 15]  target = 9
               output:   [0, 1]
"""             
nums = [2, 7, 11, 15]
target = 9

solution = Solution()
result = solution.twoSum(nums, target)
print('输出为:', result)      # [0, 1]

方法三: 哈希法,时间复杂度: O ( n ) O(n) O(n)

执行用时 :84 ms, 在所有 Python3 提交中击败了48.61%的用户
内存消耗 :15.1 MB, 在所有 Python3 提交中击败了5.48%的用户
class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dic = {}
        for index, num in enumerate(nums):
            if target - num in dic:
                return [dic[target-num], index]
            else:
                dic[num] = index

"""
For Example:    input:   nums = [2, 7, 11, 15]  target = 9
               output:   [0, 1]
"""             
nums = [2, 7, 11, 15]
target = 9

solution = Solution()
result = solution.twoSum(nums, target)
print('输出为:', result)    # [0, 1]

图解:

引用的图片展示的是方法四的动态过程,可以帮助分析,很不错

参考

  1. https://github.com/MisterBooo/LeetCodeAnimation

此外

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值