1716. 计算力扣银行的钱
![双周赛43 数学递推,递归,栈,[TODO]: 思维题_第1张图片](http://img.e-com-net.com/image/info8/13d62d64616544e68f3a0b0b9a05425e.jpg)
Note
- 直接线性模拟,时间复杂度o(n),懒得贴代码了
- 利用公式:7 * (7 + week) * / 2 + left * (left + 1) / 2 + left * week; 线性复杂度求出
等差数列化简后可得
i+(i+1)+(i+2)+…+(j-2)+(j-1)+j = (i+j)(j-i+1)/2;
1717. 删除子字符串的最大得分
![双周赛43 数学递推,递归,栈,[TODO]: 思维题_第2张图片](http://img.e-com-net.com/image/info8/45805e0f4a204188a628dc9dc3942816.jpg)
Note
- 做的时候xjb试了一下,竟然过了,事后分析了一下,整体思路如下所示:
- 利用栈进行模拟,思路是第一遍删除所有的ab,第二遍删除所有的ba(若x < y 则换一下顺序即可)
- 这样的原因是利用贪心,尽可能多的先删除分值大的,再删除分值小的,但有一点需要证明:如何保证在第一遍删除ab之后,第二遍删除ba的时候不会再出现ab?
- 原因:如果字符串中含有其他的字符,就以该字符为分隔,分别考虑左右两个字符串即可。若没有:显然ab字符串删除ab后,在删除ba时不会出现ab的情况
Code
class Solution:
def maximumGain(self, s: str, x: int, y: int) -> int:
a = list(s)
if(len(a) < 2): return 0
suma, sumb = 0,0
first = [a[0]]
second = [a[0]]
for i in range(1, len(a)):
if(len(first) > 0 and first[-1] == 'a' and a[i] == 'b'):
del first[-1]
suma += x
else:
first.append(a[i])
if(len(first) > 0):
temp = [first[0]]
for i in range(1,len(first)):
if(len(temp) > 0 and temp[-1] == 'b' and first[i] == 'a'):
del temp[-1]
suma += y
elif(len(temp) > 0 and temp[-1] == 'a' and first[i] == 'b'):
del temp[-1]
sumb += x
else:
temp.append(first[i])
for i in range(1, len(a)):
if(len(second) > 0 and second[-1] == 'b' and a[i] == 'a'):
del second[-1]
sumb += y
else:
second.append(a[i])
if(len(second) > 0):
temp = [second[0]]
for i in range(1,len(second)):
if(len(temp) > 0 and temp[-1] == 'a' and second[i] == 'b'):
del temp[-1]
sumb += x
elif(len(temp) > 0 and temp[-1] == 'b' and second[i] == 'a'):
del temp[-1]
sumb += y
else:
temp.append(second[i])
return max(suma, sumb)
1718. 构建字典序最大的可行序列
![双周赛43 数学递推,递归,栈,[TODO]: 思维题_第3张图片](http://img.e-com-net.com/image/info8/1a2b489ede8847aa9d6a0c77ee7c8768.jpg)
Note
- dfs递归模拟,写起来还是有些生疏. 没在指定时间写完QAQ
Code
class Solution:
ans = []
flag = 0
def constructDistancedSequence(self, n: int) -> List[int]:
visit = [0] * (n+1)
res = [0] * (2 * n -1)
def dfs(pos, visit, res):
if(pos == 2 * n -1):
self.flag = 1
self.ans = res
return
if(res[pos] > 0):
dfs(pos+1, visit, res)
else:
for i in range(n,0,-1):
if(visit[i] > 0): continue
if(i > 1 and (pos + i >= 2 * n - 1 or res[i + pos] > 0)): continue
visit[i] = 1
res[pos] = i
if(i > 1): res[i + pos] = i
dfs(pos+1,visit,res)
if(self.flag == 1): return
visit[i] = 0
res[pos] = 0
if(i > 1): res[i+pos] = 0
dfs(0,visit,res)
return self.ans
1719. 重构一棵树的方案数
![双周赛43 数学递推,递归,栈,[TODO]: 思维题_第4张图片](http://img.e-com-net.com/image/info8/07d7704ae1734294953a956abcb02cdd.jpg)
Note
- 题目理解:题目描述有些不太清楚,pair必须是目标树中的所有集合关系
- 重要的性质:祖先在pair中出现的次数,一定是大于等于孙子在pair中出现的次数的
- 方法:https://leetcode-cn.com/problems/number-of-ways-to-reconstruct-a-tree/solution/onmde-luan-gao-zuo-fa-by-weak-chicken-y2mv/
- 目前还没发现啥套路可以很好契合该题,只能是纯思维解题,等一手大佬,日后再补