[第319场周赛]式酱的解题报告
534
2022.11.13
发布于 未知归属地

总结

1668311413332.png
这里是式酱(∠・ω< )⌒☆
今天的题目总体来说有点简单,思路都挺容易想到的,T3因为不怎么会算交换次数卡了很久,T4则是一个老题翻新,把代码copy一下改一改就通过了。
以后如果继续有AK的场的话会更新自己的题解

6233. 温度转换

class Solution:
    def convertTemperature(self, celsius: float) -> List[float]:
        return [celsius + 273.15,celsius*1.8 + 32]

6234. 最小公倍数为 K 的子数组数目

暴力即可,或许可以适当地剪个枝?效果还挺好的。

class Solution:
    def subarrayLCM(self, nums: List[int], k: int) -> int:
        from math import lcm
        n = len(nums)
        res = 0
        for i in range(n):
            count = 1
            for j in range(i,n):
                count = lcm(count,nums[j])
                if count == k:
                    res += 1
                elif count > k:
                    break
        return res

6235. 逐层排序二叉树所需的最少操作数目

层序遍历,获得当前层数节点值的数组,与排序后的数组逐一比对交换。

class Solution:
    def minimumOperations(self, root: Optional[TreeNode]) -> int:
        from collections import deque
        q = deque([root])
        res = 0
        while q:
            nums = []
            # index 用来存放每个元素的下标
            index = dict()
            for i in range(len(q)):
                T = q.popleft()
                nums.append(T.val)
                index[T.val] = i
                if T.left:
                    q.append(T.left)
                if T.right:
                    q.append(T.right)
            t = nums[:]
            t.sort()
            for i in range(len(nums)):
                if t[i] == nums[i]:
                    continue
                else:
                    res += 1
                    j = index[t[i]]
                    nums[i],nums[j] = nums[j],nums[i]
                    # 已修改nums的下标 index需要接着做改动
                    index[nums[j]] = j
                    index[nums[i]] = i
        return res

6236. 不重叠回文子字符串的最大数目

子题目:求最大回文子串。
利用贪心的思想,在dp中一旦找到一个段落内最大回文子串长度大于等于k,立马做一个截断,很明显这种策略是最优的。
贪心的思想与前几周的题目一模一样 2444. 统计定界子数组的数目

class Solution:
    def maxPalindromes(self, s: str, k: int) -> int:
        n = len(s)
        dp = [[0]*n for _ in range(n)]
        res = 0
        # pre用于记录当前这个段的结尾
        pre = n
        for i in range(n-1,-1,-1):
            max_count = 0
            # 注意划分一个上界
            for j in range(i,pre):
                if s[i] == s[j]:
                    if j - i <= 1:
                        dp[i][j] = j - i + 1
                    elif dp[i+1][j-1]:
                        dp[i][j] = dp[i+1][j-1] + 2
                max_count = max(max_count,dp[i][j])
            if max_count >= k:
                res += 1
                pre = i

        return res
评论 (1)