两道编程题 - 贪心+模拟

两道编程题 - 贪心+模拟(不过挺像滑动窗口的)

2383. 赢得比赛需要的最少训练时长(23.3.13)

题目链接:2383. 赢得比赛需要的最少训练时长
题目大意:
你正在参加一场比赛,给你两个 正 整数 initialEnergy 和 initialExperience 分别表示你的初始精力和初始经验。
另给你两个下标从 0 开始的整数数组 energy 和 experience,长度均为 n 。
你将会 依次 对上 n 个对手。第 i 个对手的精力和经验分别用 energy[i] 和 experience[i] 表示。当你对上对手时,需要在经验和精力上都 严格 超过对手才能击败他们,然后在可能的情况下继续对上下一个对手。
击败第 i 个对手会使你的经验 增加 experience[i],但会将你的精力 减少 energy[i] 。
在开始比赛前,你可以训练几个小时。每训练一个小时,你可以选择将增加经验增加 1 或者 将精力增加 1 。
返回击败全部 n 个对手需要训练的 最少 小时数目。

注意:(1)n == energy.length == experience.length;(2)1 <= n <= 100;(3)1 <= initialEnergy, initialExperience, energy[i], experience[i] <= 100

示例:

输入:initialEnergy = 5, initialExperience = 3, energy = [1,4,3,2], experience = [2,6,3,1]
输出:8
解释:在 6 小时训练后,你可以将精力提高到 11 ,并且再训练 2 个小时将经验提高到 5 。
按以下顺序与对手比赛:
- 你的精力与经验都超过第 0 个对手,所以获胜。
  精力变为:11 - 1 = 10 ,经验变为:5 + 2 = 7 。
- 你的精力与经验都超过第 1 个对手,所以获胜。
  精力变为:10 - 4 = 6 ,经验变为:7 + 6 = 13 。
- 你的精力与经验都超过第 2 个对手,所以获胜。
  精力变为:6 - 3 = 3 ,经验变为:13 + 3 = 16 。
- 你的精力与经验都超过第 3 个对手,所以获胜。
  精力变为:3 - 2 = 1 ,经验变为:16 + 1 = 17 。
在比赛前进行了 8 小时训练,所以返回 8 。
可以证明不存在更小的答案。

输入:initialEnergy = 2, initialExperience = 4, energy = [1], experience = [3]
输出:0
解释:你不需要额外的精力和经验就可以赢得比赛,所以返回 0 。

参考代码:

class Solution:
    def minNumberOfHours(self, initialEnergy: int, initialExperience: int, energy: List[int], experience: List[int]) -> int:
        n = len(experience)
        eS = sum(energy)
        ans = eS-initialEnergy+1 if eS>=initialEnergy else 0
        ta = initialExperience
        for a in experience:
            if ta <= a:
                ans += a-ta+1
                # 要比当前值大1 所以ta=a+1
                ta = a+1
            ta += a
            print(ta)
        return ans
  • 时间复杂度: O ( n ) O(n) O(n),其中 n 为数组 energy 的长度。
  • 空间复杂度: O ( n ) O(n) O(n)

1605. 给定行和列的和求可行矩阵(23.3.14)

题目链接:1605. 给定行和列的和求可行矩阵
题目大意:
给你两个非负整数数组 rowSum 和 colSum ,其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和。换言之你不知道矩阵里的每个元素,但是你知道每一行和每一列的和。
请找到大小为 rowSum.length x colSum.length 的任意 非负整数 矩阵,且该矩阵满足 rowSum 和 colSum 的要求。
请你返回任意一个满足题目要求的二维矩阵,题目保证存在 至少一个 可行矩阵。

注意:(1)1 <= rowSum.length, colSum.length <= 500;(2)0 <= rowSum[i], colSum[i] <= 1 0 8 10^8 108;(3)sum(rowSum) == sum(colSum)。

示例:

输入:rowSum = [3,8], colSum = [4,7]
输出:[[3,0],
     		[1,7]]
解释:
第 0 行:3 + 0 = 3 == rowSum[0]
第 1 行:1 + 7 = 8 == rowSum[1]
第 0 列:3 + 1 = 4 == colSum[0]
第 1 列:0 + 7 = 7 == colSum[1]
行和列的和都满足题目要求,且所有矩阵元素都是非负的。
另一个可行的矩阵为:[[1,2],
                  					 [3,5]]

输入:rowSum = [5,7,10], colSum = [8,6,8]
输出:[[0,5,0],
      		[6,1,0],
      		[2,0,8]]

输入:rowSum = [14,9], colSum = [6,9,8]
输出:[[0,9,5],
      		[6,0,3]]

输入:rowSum = [1,0], colSum = [1]
输出:[[1],
      		[0]]

输入:rowSum = [0], colSum = [0]
输出:[[0]]

参考代码:

class Solution:
    def restoreMatrix(self, rowSum: List[int], colSum: List[int]) -> List[List[int]]:
        m,n = len(rowSum),len(colSum)
        ans = [[0]*n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                x = min(rowSum[i],colSum[j])
                ans[i][j] = x
                rowSum[i] -= x
                colSum[j] -= x
        return ans
  • 时间复杂度: O ( m × n ) O(m \times n) O(m×n),其中 m,n 为数组的行数和列数。
  • 空间复杂度: O ( m × n ) O(m \times n) O(m×n)

小结

这道题理解起来思路并不难,主要是自己绊在了条件判断上,记住需要如果每次能量比较不满足严格大于要求时,需要更新下次用于能量对比的值,也就是这行代码ta = a+1 ,细心一些。

猜你喜欢

转载自blog.csdn.net/weixin_42269028/article/details/129487059