【Leetcode第225场周赛】score:18 Time: 1:28:26 Rank:167/3851

这篇博客探讨了四个算法问题,涉及字符串处理、字符异或、堆栈操作和数学逻辑。第一题是替换隐藏数字以得到最晚时间,第二题是计算使字符串满足特定条件的最小字符修改次数,第三题是找出二维矩阵中第k大的异或坐标值,最后一题是确定摆放盒子的最优化方式。这些问题都需要巧妙的算法思维和数学技巧来解决。
摘要由CSDN通过智能技术生成

昨天的双周赛做的一塌糊涂,今早一醒来思路全出来了,然后这周的周赛做的也还好

5661. 替换隐藏数字得到的最晚时间(3分,通过率:2885/7650)

给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。
有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和 23:59 。
替换 time 中隐藏的数字,返回你可以得到的最晚有效时间。

分类讨论即可,要注意的是隐藏数字的位置与取得的最大数有关

class Solution:
    def maximumTime(self, time: str) -> str:
        ans = ""
        ##第一位数字
        if time[0]!="?":
            ans += time[0]
        else:
            if time[1]!='?' and time[1]>'3':
                ans +='1'
            else:
                ans +='2'
        ##第二位数字
        if time[1]!="?":
            ans += time[1]
        else:
            if ans[0]=="2":
                ans += "3"
            else:
                ans += "9"
        #分隔符
        ans += ":"
        ##第三位数字
        ans += "5" if time[3]=="?" else time[3]
        ##第四位数字
        ans += "9" if time[4]=="?" else time[4]
        return ans

5662. 满足三条件之一需改变的最少字符数(4分,通过率:710/5038)

给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。
操作的最终目标是满足下列三个条件 之一 :
①.a 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。
②.b 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。
③.和 b 都 由 同一个 字母组成。

返回达成目标所需的 最少 操作数。

思路:模拟,找基准;将a,b的字母频率统计到数组中,并想象以某个基准为例,a的字母频率在基准以左的变为0,b的字母频率在基准以右的变为0,或相反,即可满足条件1 or 条件2,而统计两者频率之和,取最大数,即可处理得到条件3
以leetcode题解中一图为例:
在这里插入图片描述
a,b间的那条线即为基准,这个基准不断右移统计条件1、2即可

class Solution:
    def minCharacters(self, a: str, b: str) -> int:
        cnta,cntb =[0]*26,[0]*26
        cntsum = [0]*26
        lena,lenb=len(a),len(b)
        for i in a:
            cnta[ord(i)-97]+=1
            cntsum[ord(i)-97]+=1
        for j in b:
            cntb[ord(j)-97]+=1
            cntsum[ord(j)-97]+=1
        ans3 = lena+lenb-max(cntsum)
        ans = ans3
        for i in range(1,26):
            ans1 = sum(cnta[:i])+sum(cntb[i:])
            ans2 = sum(cntb[:i])+sum(cnta[i:])
            ans = min(ans1,ans2,ans)
        return ans

时间复杂度O(n+m+26)

5663. 找出第 K 大的异或坐标值(5分,通过率:1395/2516)

给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。
矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。
请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。

使用dp数组统计得出每个位置的值,排序取第k大

class Solution:
    def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:
        m,n = len(matrix),len(matrix[0])
        dp = matrix
        for i in range(1,n):
            dp[0][i] ^= dp[0][i-1]           
        for j in range(1,m):
            dp[j][0] ^= dp[j-1][0]
        for j in range(1,m):
            for i in range(1,n):
                dp[j][i] ^= (dp[j-1][i]^dp[j-1][i-1]^dp[j][i-1])
        ans= []
        for i in range(m):
            ans += dp[i][:]
        ans.sort(reverse=True)
        return ans[k-1]

时间复杂度O(nm log (mn))

5664. 放置盒子(6分,通过率:338/1166)
在这里插入图片描述
感觉像是小学奥数题,找规律
思路:先定层高再定底数
先找到n所对应的最大层高,这里可以使用求和公式实现给出
1k+2(k-1)+3*(k-2) + ··· + k1 = (k(k+1)*(k+2))//6
然后看底层,底层增加1块,上层可加0块
底层增加2块,上层可加1块
底层增加3块,上层可加2+1块
同理
底层增加n块,上层可增加n-1+n-2+···+1块
使用求和公式再次判断位置即可

class Solution:
    def minimumBoxes(self, n: int) -> int:
        def f(n):
            return (n*(n+1)*(n+2))//6
        cnt = [f(i) for i in range(0,1820)]
        pile = 0
        while(cnt[pile]<=n):
            pile += 1
        pile = pile-1 #层数
        ans = (pile+1)*pile//2
        n -= cnt[pile]
        i = 0
        while(True):
            if (n<=(i+1)*i//2):
                break
            else:
                i += 1
        return ans+i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值