吃掉LeetCode之2022/2/4
作者:互联网
吃掉LeetCode之2022/2/4
目录
560. 和为 K 的子数组
给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。
示例 1:
输入:nums = [1,1,1], k = 2
输出:2
示例 2:
输入:nums = [1,2,3], k = 3
输出:2
代码思路:
前缀和加哈希表
题解来自于别人的题解
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
d={}
acc,res=0,0
for num in nums:
acc += num
if acc == k:count += 1
if acc-k in d:count+=d[acc-k]
if acc in d:d[acc] += 1
else:d[acc] = 1
return count
279. 完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9
代码思路:
我们可以依据题目的要求写出状态表达式:
f
[
i
]
f[i]
f[i]表示最少需要多少个数的平方来表示整数
i
i
i。
这些数必然落在区间
[
1
,
n
]
[1,\sqrt{n}]
[1,n
]。我们可以枚举这些数,假设当前枚举到
j
j
j,那么我们还需要取若干数的平方,构成
i
−
j
2
i-j^2
i−j2 。此时我们发现该子问题和原问题类似,只是规模变小了。这符合了动态规划的要求,于是我们可以写出状态转移方程。
f
[
i
]
=
1
+
min
j
=
1
⌊
i
⌋
f
[
i
−
j
2
]
f[i]=1+\min_{j=1}^{\lfloor\sqrt{i}\rfloor}{f[i-j^2]}
f[i]=1+j=1min⌊i
⌋f[i−j2]
其中
f
[
0
]
=
0
f[0]=0
f[0]=0为边界条件,实际上我们无法表示数字 0,只是为了保证状态转移过程中遇到
j
j
j 恰为
i
\sqrt{i}
i
的情况合法。
同时因为计算
f
[
i
]
f[i]
f[i]时所需要用到的状态仅有
f
[
i
−
j
2
]
f[i-j^2]
f[i−j2],必然小于
i
i
i,因此我们只需要从小到大地枚举
i
i
i 来计算
f
[
i
]
f[i]
f[i] 即可。
class Solution:
def numSquares(self, n: int) -> int:
dp=[0]*(n+1)
for i in range(1,n+1):
minn=10000000
for j in range(1,n+1):
if j*j<=i:minn=min(minn,dp[i-j*j])
else:break
dp[i]=minn+1
return dp[n]
标签:acc,吃掉,nums,int,示例,平方,整数,2022,LeetCode 来源: https://blog.csdn.net/m0_46272485/article/details/122781949