记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
9/7 940. 不同的子序列 II
动态规划 dpi 代表以si结尾的子序列数目
如果a<b sa=sb 则dpa,dpb会存在重复的子序列
但是dpa必定是dpb的真子集 只要将dpa中的sa变为sb及全部包含进了dpb
所以对于dpi只要记录0\~i-1间的最近的不同字符dp
res0,25分别记录a~z最近的位置
python
def distinctSubseqII(s):
"""
:type s: str
:rtype: int
"""
res = [-1]*26
MOD = 10**9+7
n= len(s)
dp = [1]*n
for i,c in enumerate(s):
for j in range(26):
if res[j]!=-1:
dp[i] = (dp[i]+dp[res[j]])%MOD
res[ord(s[i])-ord('a')] = i
ans = 0
for i in range(26):
if res[i]!=-1:
ans = (ans+dp[res[i]])%MOD
return ans
9/8 3870. 统计范围内的逗号
1000开始有1个逗号 因为n<100000
最多一个数就一个逗号 统计有多少个大于999的数即刻
python
def countCommas(n):
"""
:type n: int
:rtype: int
"""
return max(0,n-999)
9/9 3871. 统计范围内的逗号 II
从右边每三位插一个逗号,不足四位没有逗号。
1,999 贡献 0;1000,999999 贡献 1;1000000,999999999 贡献 2,依此类推。
从 1000 起每次乘 1000,所有 >= x 的数各再贡献一个逗号,累加 n-x+1 直到 x>n。
python
def countCommas(n):
"""
:type n: int
:rtype: int
"""
ans = 0
x = 1000
while x <= n:
ans += n - x + 1
x *= 1000
return ans
9/10 2265. 统计值等于子树平均值的节点数
递归 统计左右子树的总和和节点数,如果当前节点的值等于子树的平均值,则计数加1。
python
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def averageOfSubtree(root):
"""
:type root: TreeNode
:rtype: int
"""
global ans
ans = 0
def check(node):
if not node:
return 0, 0
left_sum, left_count = check(node.left)
right_sum, right_count = check(node.right)
total_sum = node.val + left_sum + right_sum
total_count = 1 + left_count + right_count
if total_sum // total_count == node.val:
global ans
ans += 1
return total_sum, total_count
check(root)
return ans
9/11 3483. 不同三位偶数的数目
从 digits 里选三个不同下标组成三位数,个位必须是偶数,百位不能为 0,求不同数值的个数。
数组长度不超过 10,三层枚举所有下标组合,用集合去重后返回大小即可。
python
def totalNumbers(digits):
"""
:type digits: List[int]
:rtype: int
"""
s = set()
n = len(digits)
for i in range(n):
if digits[i] % 2:
continue
for j in range(n):
if j == i:
continue
for k in range(n):
if k == i or k == j or digits[k] == 0:
continue
s.add(digits[k] * 100 + digits[j] * 10 + digits[i])
return len(s)
9/12
python
9/13
python