基本概念
LeetCode懒人小白刷题攻略
[算法通关手册」电子书网站地址:https://algo.itcharge.cn
照着datawhale大佬们的攻略刷
Exercises
2235. 两整数相加
def target_sum(num1, num2):
return num1 + num2
T(n) = O(1), S(n) = O(1)
1929. 数组串联
def get_concatenation(nums):
ans = nums
for i in range(len(nums)):
ans.append(nums[i])
return ans
T(n) = O(n)
- 创建ans的操作是
O(n)
,因为它需要复制nums
列表中的所有元素。 - 循环遍历
nums
并追加每个元素到ans
列表中也是O(n)
,因为需要遍历一次nums
中的所有元素。 所以,总的时间复杂度是O(n) + O(n)
,简化后仍然是O(n)
S(n) = O(n)
- 创建
nums
的副本需要O(n)
的额外空间来存储这些元素。 所以,空间复杂度是O(n)
。
0771. 宝石与石头
def num_jewels_in_stones(jewels,stones):
count = 0
for s in stones:
if s in jewels:
count += 1
return count
T(n) = O(m*n)
- 遍历
stones
字符串中的每个字符,这个操作的时间复杂度是O(m)
,其中m
是stones
字符串的长度。 - 对于
stones
字符串中的每个字符,我们需要检查它是否出现在jewels
字符串中。在最坏的情况下(即jewels
包含所有可能的字符),这个检查操作的时间复杂度是O(n)
,其中n
是jewels
字符串的长度。 - 总的时间复杂度是
O(m * n)
S(n) = O(1)
- 使用了一个计数变量
count
,它是一个单独的整数,所以空间复杂度是O(1)
1480. 一维数组的动态和
def running_sum(nums):
result = []
for i in range(len(nums)):
result.append(sum(nums[:i+1]))
return result
T(n) = O(n^2)
for
循环会遍历nums
列表中的每个元素,因此循环的次数为n
,其中n
是nums
的长度。- 在每次循环中,
sum(nums[:i+1])
计算了nums
从开始到当前索引i
(包括i
)的累积和。由于sum
函数需要遍历从列表开始到索引i
的所有元素,这部分的时间复杂度是i
。 - 由于
i
从1
增加到n
,所以累积的时间复杂度是1 + 2 + 3 + ... + n
,这是一个等差数列求和的公式,结果为n(n+1)/2
,简化后是 O(n^2)
。 - 改进之后时间复杂度减为O(n)
-
def running_sum(nums): result = [] current_sum = 0 for num in nums: current_sum += num result.append(current_sum) return result
S(n) = O(n)
result
列表会存储所有累积和,其大小与输入列表nums
相同,因此需要O(n)
的空间。
0709. 转换成小写字母
def to_lower_case(s):
c = ''
for char in s:
if char.isupper():
c +=char.lower()
else:
c += char
return c
T(n) = O(n)
- 函数中的
for
循环会遍历输入字符串s
中的每个字符,因此循环的次数为n
,其中 n是s
的长度。 - 在每次循环中,对字符进行大小写转换的操作(
char.lower()
)是一个常数时间操作,即O(1)
。 - 总的时间复杂度是
O(n)
,其中 n是输入字符串s
的长度。
S(n) = O(n)
c
字符串用于存储转换后的结果,其长度与输入字符串s
相同
1672. 最富有客户的资产总量
def maximum_wealth(accounts):
result = 0
for i in range(len(accounts)):
if result < sum(accounts[i]):
result = sum(accounts[i])
return result
T(n) = O(m*n)
for
循环会遍历accounts
列表中的每个子列表,因此循环的次数为n
,其中n
是accounts
中子列表的数量- 在每次循环中,
sum(accounts[i])
计算了当前子列表accounts[i]
中所有元素的和,这个操作的时间复杂度是O(m)
,其中m
是子列表accounts[i]
的长度。 - 总的时间复杂度是O(nm)
S(n) = O(1)
- 使用单个变量
result
来存储最大财富值,因此空间复杂度是O(1)
reference:LeetCode 算法笔记