第165场周赛实录(数学题+动态规划-未完成)

文章目录

  • 1. 不浪费原料的汉堡制作方案(数学题)
  • 2. 统计全为 1 的正方形子矩阵(动态规划)
  • 3. 分割回文串 III(动态规划)

1. 不浪费原料的汉堡制作方案(数学题)

难度:中等

圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。

给你两个整数 tomatoSlices 和 cheeseSlices,分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下:

  • 巨无霸汉堡:4 片番茄和 1 片奶酪
  • 小皇堡:2 片番茄和 1 片奶酪

请你以 [total_jumbo, total_small]([巨无霸汉堡总数,小皇堡总数])的格式返回恰当的制作方案,使得剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量都是 0。

如果无法使剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量为 0,就请返回 []。

示例 1:

输入:tomatoSlices = 16, cheeseSlices = 7
输出:[1,6]
解释:制作 1 个巨无霸汉堡和 6 个小皇堡需要 41 + 26 = 16 片番茄和 1 + 6 = 7 片奶酪。不会剩下原料。

示例 2:

输入:tomatoSlices = 17, cheeseSlices = 4
输出:[]
解释:只制作小皇堡和巨无霸汉堡无法用光全部原料。

示例 3:

输入:tomatoSlices = 4, cheeseSlices = 17
输出:[]
解释:制作 1 个巨无霸汉堡会剩下 16 片奶酪,制作 2 个小皇堡会剩下 15 片奶酪。

示例 4:

输入:tomatoSlices = 0, cheeseSlices = 0
输出:[0,0]

示例 5:

输入:tomatoSlices = 2, cheeseSlices = 1
输出:[0,1]

提示:

  • 0 <= tomatoSlices <= 10^7
  • 0 <= cheeseSlices <= 10^7

解决方案:

class Solution:
    def numOfBurgers(self, tomatoSlices: int, cheeseSlices: int) -> List[int]:
        res = []
        if tomatoSlices%2 != 0:
            return res
        x = tomatoSlices//2 - cheeseSlices
        y = 2 * cheeseSlices - tomatoSlices//2
        if x < 0 or y < 0:
            return res
        res.append(x)
        res.append(y)
        return res
执行用时 内存消耗 语言
64 ms 13.7 MB Python3

2. 统计全为 1 的正方形子矩阵(动态规划)

难度:中等

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。

示例 1:

输入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
输出:15
解释:
边长为 1 的正方形有 10 个。
边长为 2 的正方形有 4 个。
边长为 3 的正方形有 1 个。
正方形的总数 = 10 + 4 + 1 = 15.

示例 2:

输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.

提示:

  • 1 <= arr.length <= 300
  • 1 <= arr[0].length <= 300
  • 0 <= arr[i][j] <= 1

解决方案:

class Solution:
    def countSquares(self, matrix: List[List[int]]) -> int:
        n=len(matrix)
        m=len(matrix[0])
        ans=0
        for i in range(0,m):
            ans+=matrix[0][i]
        for i in range(1,n):
            ans+=matrix[i][0]
        for i in range(1,n):
            for j in range(1,m):
                if matrix[i][j]:
                    matrix[i][j]=min(matrix[i-1][j-1],matrix[i][j-1],matrix[i-1][j])+1
                    ans+=matrix[i][j]    
        return ans
执行用时 内存消耗 语言
864 ms 16 MB Python3

3. 分割回文串 III(动态规划)

难度:困难

给你一个由小写字母组成的字符串 s,和一个整数 k。

请你按下面的要求分割字符串:

  • 首先,你可以将 s 中的部分字符修改为其他的小写英文字母。
  • 接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串。

请返回以这种方式分割字符串所需修改的最少字符数。

示例 1:

输入:s = “abc”, k = 2
输出:1
解释:你可以把字符串分割成 “ab” 和 “c”,并修改 “ab” 中的 1 个字符,将它变成回文串。

示例 2:

输入:s = “aabbc”, k = 3
输出:0
解释:你可以把字符串分割成 “aa”、“bb” 和 “c”,它们都是回文串。

示例 3:

输入:s = “leetcode”, k = 8
输出:0

提示:

  • 1 <= k <= s.length <= 100
  • s 中只含有小写英文字母。

解决方案(来自网友):

class Solution:
    def palindromePartition(self, s: str, k: int) -> int:
        n=len(s)
        cost=[[0]*n for _ in range(n)]
        t=0       
        for t in range(1,n):
            for i in range(0,n-t):
                j=i+t
                cost[i][j]=cost[i+1][j-1]+(s[i]!=s[j])
        dp=[[0]*k for _ in range(n)]
        for i in range(n):
            dp[i][0]=cost[0][i]
        for i in range(0,n):
            for j in range(1,k):
                m=float("inf")
                for l in range(j-2,i):
                    m=min(m,cost[l+1][i]+dp[l][j-1])
                dp[i][j]=m
        return dp[-1][-1]

你可能感兴趣的:(leetcode算法)