今日概览

  • 日期:{2025-11-13}
  • 题目数量:{共 2 题}
  • 难度分布:简单 2
  • 主要收获:自己的方法就是屎山,灵神的方法高端又通透
  • 心情/状态:太久没刷了,已经把基本的语法忘记了,以后尝试用python刷题,学习一些比较好用的函数

题目列表与详解

1. Two Sum

  • 题号 / 链接#1 / 题目链接

  • 难度简单

  • 题型标签哈希表,数组

  • 题目描述(简要)

    就是查找一下哪两个数相加等于target,返回下标。

思路分析

  1. 两个方法,不同的时间复杂度

方法一:暴力写法。

复杂度

  • 时间:O(*n*2)
  • 空间:O(1)
1
2
3
4
5
6
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i, x in enumerate(nums):
for j in range(i + 1, len(nums)):
if x + nums[j] == target:
return [i, j]

​ 这里主要是enumerate( )函数,忘记是干啥用的了,enumerate( ) 是 Python 提供的内置函数,用来在遍历可迭代对象(如列表、元组、字符串等)时,同时获得元素的索引和值。它的常见用法如下:

1
2
3
4
words = ["apple", "banana", "cherry"]

for index, item in enumerate(words):
print(index, item)

输出结果:

1
2
3
0 apple
1 banana
2 cherry

方法二:哈希。

1
2
3
4
5
6
7
8
9
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
seen = {}
for idx, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], idx]
seen[num] = idx
return []

复杂度

  • 时间:O(n)
  • 空间:O(n)

2025.11.17 二刷
出去开会几天,把enumerate函数忘记了

1
2
3
4
5
6
7
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
s={}
for i in range(len(nums)):
if target-nums[i] in s:
return [i,s[target-nums[i]]]
s[nums[i]]=i

反思与总结

  • 可以按照题目要求找符合两数相加的值,也可以换一种思路直接去查找符合要求的值,枚举其中一个变量,把它当成常量看待,从而转化成「一个变量」的问题

2. 好数对的数目

  • 题号 / 链接#2 / 题目链接
  • 难度简单
  • 题型标签哈希表,数组
  • 题目描述(简要)

    就是统计每个数出现了多少次,然后用排列组合算出来相加。

思路分析

我的垃圾写法,后续有可以进行改进,学习的新函数,还是贴了一下。

复杂度

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
n=[0 for i in range(101)]
m=0
for index,num in enumerate(nums):
n[num]+=1
for i in range(101):
t=0
while n[i]>=1:
n[i]=n[i]-1
t=t+n[i]
m+=t
return m

如果换一个数据范围可能就不行了,更通用的写法可以使用 collections.Counter 或 defaultdict(int) 自动统计。还有可以直接使用排列组合公式cnt * (cnt - 1) // 2 就能得到该值的所有好数对数量。

改进方法一:使用 Counter

1
2
3
4
5
6
7
8
9
10
from typing import List
from collections import Counter

class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
counter = Counter(nums)
ans = 0
for cnt in counter.values():
ans += cnt * (cnt - 1) // 2
return ans

改进方法二:一边遍历一边累加

1
2
3
4
5
6
7
8
9
10
11
from typing import List
from collections import defaultdict

class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
freq = defaultdict(int)
ans = 0
for num in nums:
ans += freq[num] # 之前出现了 freq[num] 个 num,与当前 num 都能构成好数对
freq[num] += 1
return ans

复杂度

  • 时间:O(n)
  • 空间:O(n)

反思与总结

  • 我的方法毫无通用性可言