leetcode第 211 场周赛

  1. 两个相同字符之间的最长子字符串在这里插入图片描述

class Solution:
    def maxLengthBetweenEqualCharacters(self, s: str) -> int:
        dic = defaultdict(list)
        for i in range(len(s)):
            dic[s[i]].append(i)
        
        res = -1
        for k in dic.keys():
            if dic[k][-1] - dic[k][0] -1  > res:
                res = dic[k][-1] - dic[k][0] - 1 
        
        return res
  1. 执行操作后字典序最小的字符串
    在这里插入图片描述
    在这里插入图片描述
class Solution:
    def findLexSmallestString(self, s: str, a: int, b: int) -> str:
        s = list(s)
        res = s
        for i in range(len(s)):
            #  轮转
            s = s[-b:] + s[:len(s)-b]
            # 修改奇数位置
            for _ in range(10):
                for j in range(1,len(s),2):
                    s[j] = str(int(s[j]) + a)[-1]
                if b % 2 == 1:
                    #  b为奇数,此时通过轮转,也能修改偶数位置
                    for __ in range(10):
                        for k in range(0,len(s),2):
                            s[k] = str(int(s[k]) + a)[-1]                    
                        res = min(res, s)[::] # 深拷贝
                else:
                    res = min(res,s)[::] # 深拷贝
        
        return "".join(res)
  1. 无矛盾的最佳球队
    在这里插入图片描述
    经典贪心dp问题

维护一个二维数组mp,存储每个球员年龄以及和所得的分数。
1. 将数组排序,以便后续贪心,排序后年龄小的优先在前,年龄相同则分值小的在前。(排序是为了快速找到转移过来的选择)
2. 维护一个一维数组dp记录从0到i中,dp[i]表示选取下标i结尾的球员所能拿到的最大分数。
3. 开始贪心,对于下标i,从下标i-1开始往前寻找前一个适应球员,并更新最大值,遍历完最后再加上下标i球员的得分。(由于已经排序,就不需要再比较年龄)
4. 每次确定dp[i]的值后,如果dp[i] > maxs, 则更新maxs,最后返回最大值maxs

在这里插入图片描述


class Solution:
    def bestTeamScore(self, scores: List[int], ages: List[int]) -> int:
        tmp = [] # 存储球员年龄以及分数
        for i in range(len(scores)):
            tmp.append((ages[i], scores[i]))
   
        tmp = sorted(tmp) # 对球员排序
        dp = [0] * len(tmp)
        maxScore = 0
        for i in range(len(tmp)):
            for j in range(i):
                if tmp[j][1] <= tmp[i][1]:
                    dp[i] = max(dp[i],dp[j])  # 查找前一个球员
            
            dp[i] += tmp[i][1]   # 加上以i结尾球员的分值
            maxScore = max(maxScore,dp[i])  # 更新最大值
         
        return maxScore
  1. 带阈值的图连通性
    在这里插入图片描述
    在这里插入图片描述
class Solution:
    def areConnected(self, n: int, threshold: int, queries: List[List[int]]) -> List[bool]:      
        parent=[i for i in range(n+1)]        
        
        def find(x):
            if x!=parent[x]:
                parent[x]=find(parent[x])
            return parent[x]
        
        def union(x,y):
            u=find(x)
            v=find(y)
            if u==v:
                return True
            parent[v]=u
            return False
        
        for i in range(threshold+1,n+1):
            for j in range(i*2,n+1,i):
                union(i,j)
        
        res=[]
        for u,v in queries:
            res.append(find(u)==find(v))
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值