力扣248场周赛 消灭怪物的最大数量 、统计好数字的数目 两题分析!

简介: 力扣248场周赛 消灭怪物的最大数量 、统计好数字的数目 两题分析!

5801.消灭怪物的最大数量


https://leetcode-cn.com/problems/eliminate-maximum-number-of-monsters/solution/5801xiao-mie-guai-wu-de-zui-da-shu-liang-2r9m/

难度:中等


题目:

你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 n 的整数数组 dist ,其中 dist[i] 是第 i 个怪物与城市的 初始距离(单位:米)。

怪物以 恒定 的速度走向城市。给你一个长度为 n 的整数数组 speed 表示每个怪物的速度,其中 speed[i] 是第 i 个怪物的速度(单位:米/分)。

怪物从 第 0 分钟 时开始移动。你有一把武器,并可以 选择 在每一分钟的开始时使用,包括第 0 分钟。但是你无法在一分钟的中间使用武器。这种武器威力惊人,一次可以消灭任一还活着的怪物。

一旦任一怪物到达城市,你就输掉了这场游戏。如果某个怪物 恰 在某一分钟开始时到达城市,这会被视为 输掉 游戏,在你可以使用武器之前,游戏就会结束。

返回在你输掉游戏前可以消灭的怪物的 最大 数量。如果你可以在所有怪物到达城市前将它们全部消灭,返回  n 。

提示:

  • n == dist.length == speed.length
  • 1 <= n <= 10 ^ 5
  • 1 <= dist[i], speed[i] <= 10 ^ 5


示例:

示例 1:
输入:dist = [1,3,4], speed = [1,1,1]
输出:3
解释:
第 0 分钟开始时,怪物的距离是 [1,3,4],你消灭了第一个怪物。
第 1 分钟开始时,怪物的距离是 [X,2,3],你没有消灭任何怪物。
第 2 分钟开始时,怪物的距离是 [X,1,2],你消灭了第二个怪物。
第 3 分钟开始时,怪物的距离是 [X,X,1],你消灭了第三个怪物。
所有 3 个怪物都可以被消灭。
示例 2:
输入:dist = [1,1,2,3], speed = [1,1,1,1]
输出:1
解释:
第 0 分钟开始时,怪物的距离是 [1,1,2,3],你消灭了第一个怪物。
第 1 分钟开始时,怪物的距离是 [X,0,1,2],你输掉了游戏。
你只能消灭 1 个怪物。
示例 3:
输入:dist = [3,2,4], speed = [5,3,2]
输出:1
解释:
第 0 分钟开始时,怪物的距离是 [3,2,4],你消灭了第一个怪物。
第 1 分钟开始时,怪物的距离是 [X,0,2],你输掉了游戏。 
你只能消灭 1 个怪物。


分析:

这道题的第一个示例,简直恶心人,什么玩意儿么!其实就是一道很简单的贪心题目

  1. 我们将dist每个子数组除以speed,得到每个怪物还有几分钟到达城市。
  2. 然后将dist进行排序
  3. 之后从index = 1开始循环遍历dist,当剩余时间小于等于index时表示无法消灭怪物,此时退出即可。


解题:

class Solution:
    def eliminateMaximum(self, dist, speed):
        if not dist:
            return 0
        ln = len(dist)
        for i in range(ln):
            dist[i] = dist[i] / speed[i]
        dist.sort()
        for i in range(1, ln):
            if dist[i] <= i:
                return i
        return ln


5802.统计好数字的数目


https://leetcode-cn.com/problems/count-good-numbers/solution/5802tong-ji-hao-shu-zi-de-shu-mu-pythonk-0gi2/

难度:中等


题目

我们称一个数字字符串是 好数字 当它满足(下标从 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 (2,3,5 或 7)。

比方说,"2582" 是好数字,因为偶数下标处的数字(2 和 8)是偶数且奇数下标处的数字(5 和 2)为质数。但 "3245" 不是 好数字,因为 3 在偶数下标处但不是偶数。

给你一个整数 n ,请你返回长度为 n 且为好数字的数字字符串 总数 。由于答案可能会很大,请你将它对 109 + 7 取余后返回 。

一个 数字字符串 是每一位都由 0 到 9 组成的字符串,且可能包含前导 0 。

提示:

  • 1 <= n <= 10 ^ 15


示例

示例 1:
输入:n = 1
输出:5
解释:长度为 1 的好数字包括 "0","2","4","6","8" 。
示例 2:
输入:n = 4
输出:400
示例 3:
输入:n = 50
输出:564908303


分析


这道题目读起来有些绕,比赛的时候没睡醒,反复看了几遍,以为要计算N以内的的质数,仔细看才发现想错了,耽误很多时间。

数字N代表一个长度为N的字符串数字,其中字符串数字是可以包含前导零的。

那么N位的字符串的每一位数字又分为了两种场景:

  1. 偶数位需要为偶数 [0, 2, 4, 6, 8]
  2. 奇数位需要为质数 [2, 3, 5, 7] (10以内的质数)下来我们就需要考虑N的奇偶性了:
  • 当N为偶数时,奇偶各占一半
  • 当为奇数时,由于下标从0开始,所以奇数为N // 2,偶数位 N // 2 + 1
    上面的内容都考虑完全后,咱们可以得到最终的计算公式:
    5 ** 偶数位和 * 4 ** 奇数位和
    但是这里需要注意N的取值范围是 1 <= n <= 10 ^ 15,
    如果正常计算 5 ** 10 ^ 15 // 2,那你会哭死的...这里需要用到快速幂。
    然而,很惭愧,学Python这么久了,一直觉得pow是一个无用的函数,直到今天打脸了。
    但比较开心的一点是,刷题的目的,不就是为了查漏补缺吗?


pow函数解析

pow() 方法返回 x ** y(x的y次方) 的值。

pow(x, y[, z])

函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z

注意:pow() 通过内置的方法直接调用,内置方法会把参数作为整型,

而 math 模块则会把参数转换为 float。

import math

math.pow( x, y )

至于快速幂的实现,这里就不细说了,大家可以参照下50题。

50.Pow(x, n)

可气的当时这道题暴力做的,所以 今天你今天偷的懒,总有一天要补回来!

所以,气不气,三行代码的解题,因为知识点学习不到位,导致不会就是不会...


解题


class Solution:
    def countGoodNumbers(self, n):
        mod = 10 ** 9 + 7
        i,j = divmod(n,2)
        return pow(5,i + j,mod) * pow(4,i,mod) % mod




相关文章
|
12月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
182 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
75 1
Leetcode第383场周赛
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
111 0
|
存储 算法 数据可视化
力扣155题最全解法:如何实现支持常数时间获取最小值的最小栈(附详细图解和复杂度分析)
力扣155题最全解法:如何实现支持常数时间获取最小值的最小栈(附详细图解和复杂度分析)
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
167 1
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
138 0
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
104 0
|
存储
Leetcode第382场周赛
```markdown 给定字符串`s`,计算按键变更次数,即使用不同键的次数,不考虑大小写差异。例如,`&quot;aAbBcC&quot;`变更了2次。函数`countKeyChanges`实现此功能。另外,求满足特定模式子集最大元素数,`maximumLength`函数使用`TreeMap`统计次数,枚举并构建子集,返回最大长度。最后,Alice和Bob玩鲜花游戏,Alice要赢需满足鲜花总数奇数、顺时针在[1,n]、逆时针在[1,m],返回满足条件的(x, y)对数,可通过奇偶性分类讨论求解。 ```
69 1
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
108 6
|
存储 算法 数据挖掘
LeetCode 题目 43:字符串相乘 多种算法分析对比 【python】
LeetCode 题目 43:字符串相乘 多种算法分析对比 【python】