双周赛43 数学递推,递归,栈,[TODO]: 思维题

1716. 计算力扣银行的钱

双周赛43 数学递推,递归,栈,[TODO]: 思维题_第1张图片

Note

  1. 直接线性模拟,时间复杂度o(n),懒得贴代码了
  2. 利用公式: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张图片

Note

  1. 做的时候xjb试了一下,竟然过了,事后分析了一下,整体思路如下所示:
  2. 利用栈进行模拟,思路是第一遍删除所有的ab,第二遍删除所有的ba(若x < y 则换一下顺序即可)
  3. 这样的原因是利用贪心,尽可能多的先删除分值大的,再删除分值小的,但有一点需要证明:如何保证在第一遍删除ab之后,第二遍删除ba的时候不会再出现ab?
  4. 原因:如果字符串中含有其他的字符,就以该字符为分隔,分别考虑左右两个字符串即可。若没有:显然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张图片

Note

  1. 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张图片

Note

  1. 题目理解:题目描述有些不太清楚,pair必须是目标树中的所有集合关系
  2. 重要的性质:祖先在pair中出现的次数,一定是大于等于孙子在pair中出现的次数的
  3. 方法:https://leetcode-cn.com/problems/number-of-ways-to-reconstruct-a-tree/solution/onmde-luan-gao-zuo-fa-by-weak-chicken-y2mv/
  4. 目前还没发现啥套路可以很好契合该题,只能是纯思维解题,等一手大佬,日后再补

你可能感兴趣的:(LeetCode)