返回

强势解析:LeetCode 1. 两数之和,手把手教您轻松搞定!

闲谈

题目背景:

给定一个包含 n 个整数的数组 nums 和一个整数目标值 target,要求您在该数组中找到两个数字,使得这两个数字之和等于目标值 target。并且返回这两个数字的索引。

思路剖析:

解决两数之和问题的思路主要有两种:暴力搜索和哈希表法。

1. 暴力搜索法:

暴力搜索法是最直观的解法,也是最容易理解的。其基本思想是:对数组中的每个元素逐个进行比较,若发现两个元素之和等于目标值 target,则记录下这两个元素的索引并返回。暴力搜索法的时间复杂度为 O(n^2),其中 n 是数组 nums 的长度。

def twoSum_brute(nums, target):
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]
    return None

2. 哈希表法:

哈希表法是一种更高效的解法。其基本思想是:利用哈希表将数组中的每个元素及其索引存储起来,当需要查找两个元素之和是否等于目标值 target 时,只需在哈希表中查找是否存在与 target - nums[i] 相等的元素即可。如果存在,则表示找到了两个元素,其索引分别为 i 和哈希表中查找到的元素的索引。哈希表法的平均时间复杂度为 O(n),空间复杂度为 O(n)。

def twoSum_hash(nums, target):
    hashmap = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in hashmap:
            return [hashmap[complement], i]
        hashmap[num] = i
    return None

代码实现:

def twoSum(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]

    # 哈希表法
    hashmap = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in hashmap:
            return [hashmap[complement], i]
        hashmap[num] = i

    return None

结语:

两数之和是 LeetCode 上的一道经典问题,也是算法面试中经常考察的题目。掌握两数之和问题的解法和技巧,可以帮助您在算法面试中脱颖而出。同时,两数之和问题也是学习算法和数据结构的一个很好的切入点,通过解决这个问题,您将对算法的基本原理和数据结构的应用有更深入的理解。