跳转至

LeetCode

两数之和

LeetCode原题地址: https://leetcode-cn.com/problems/add-two-numbers

给出两个**非空**的链表用来表示两个非负的整数。其中,它们各自的位数是按照**逆序**的方式存储的,并且它们的每个节点只能存储**一位**数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

  • 输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
  • 输出: 7 -> 0 -> 8
  • 原因: 342 + 465 = 807

两数之和

LeetCode原题地址: https://leetcode-cn.com/problems/two-sum

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

示例

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

1. 暴力解法

1
2
3
4
def two_sum(nums: list[int], target: int) -> list[int]:
    for i, e in enumerate(nums):
        if target - e in nums[i + 1:]:
            return([i, i + 1 + nums[i + 1:].index(target - e)])

2. 列表推导式

1
2
3
4
5
6
def two_sum(nums: list[int], target: int) -> list[int]:
    result = [
        [i, i + 1 + nums[i + 1:].index(target - e)] 
        for i, e in enumerate(nums) if target - e in nums[i + 1:]
    ]
    return  result[0] if len(result) > 0 else None

3. 排序

思路:先对数组进行排序,然后使用双指针进行查找。

def two_sum(nums: list[int], target: int) -> list[int]:
    sorted_id_nums = sorted(range(len(nums)), key=lambda x: nums[x])
    left = 0
    right = len(nums) - 1

    while left < right:
        two_sum = nums[sorted_id_nums[left]] + nums[sorted_id_nums[right]]
        if two_sum == target:
            return [sorted_id_nums[left], sorted_id_nums[right]]
        elif two_sum < target:
            left += 1
        elif two_sum > target:
            right -= 1

4. 哈希求解

def two_sum(nums: list[int], target: int) -> list[int]:
    hashmap = {}

    for i, e in enumerate(nums):
        diff = target - e

        if diff in hashmap:
            return [hashmap.get(diff), i]

        hashmap[e] = i

5. 排序+哈希

def two_sum(nums: list[int], target: int) -> list[int]:
    hashmap = {}
    sorted_id_nums = sorted(range(len(nums)), key=lambda x: nums[x])
    left, right = 0, len(nums) - 1

    while left <= right:
        lv = nums[sorted_id_nums[left]]
        rv = nums[sorted_id_nums[right]]
        ldiff = target - lv
        rdiff = target - rv

        if ldiff in hashmap:

            return [hashmap.get(ldiff), sorted_id_nums[left]]
        else:
            hashmap[lv] = sorted_id_nums[left]

        if rdiff in hashmap:
            return [hashmap.get(rdiff), sorted_id_nums[right]]
        else:
            hashmap[rv] = sorted_id_nums[right]

        left += 1
        right -= 1

三数之和

LeetCode原题地址: https://leetcode-cn.com/problems/3sum

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 abc ,使得 a + b + c = 0,请你找出所有满足条件且不重复的三元组。注意,答案中不可以包含重复的三元组。

示例

示例: 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:

1
2
3
4
[
    [-1, 0, 1],
    [-1, -1, 2]
]

无重复字符的最长子串

给定一个字符串,请找出其中不含有重复字符的最长子串的长度。

序号 输入 输出 解释
1 "abcabcbb" 3 因为无重复字符的最长子串是 "abc",所以其长度为 3。
2 "bbbbb" 1 因为无重复字符的最长子串是 "b",所以其长度为 1。
3 "pwwkew" 3 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。