当前位置: 首页 > article >正文

LeetCode 第416场周赛个人题解



 

目录

Q1. 举报垃圾信息

原题链接

思路分析

AC代码

Q2. 移山所需的最少秒数

原题链接

思路分析

AC代码

Q3. 统计重新排列后包含另一个字符串的子字符串数目 I

原题链接

思路分析

AC代码

Q4. 统计重新排列后包含另一个字符串的子字符串数目 II

原题链接

思路分析

AC代码


Q1. 举报垃圾信息

原题链接

Q1. 举报垃圾信息

思路分析

直接模拟

AC代码

class Solution:
    def reportSpam(self, message: List[str], bannedWords: List[str]) -> bool:
        st = set(bannedWords)
        res = 0
        for s in message:
            if s in st:
                res += 1
        return res >= 2

Q2. 移山所需的最少秒数

原题链接

Q2. 移山所需的最少秒数

思路分析

二分

显然具有单调性,给的时间越多,干的活越多

我们二分秒数

如何check?

通过二分能够得到每个人在 x 秒时限下能干的活

时间复杂度:O(logU n logU)

AC代码

st = [0]
N = 100_000
for i in range(1, N + 1):
    st.append(st[-1] + i)

class Solution:
    def minNumberOfSeconds(self, mountainHeight: int, workerTimes: List[int]) -> int:
        workerTimes.sort()

        def check(m: int) -> bool:
            t = mountainHeight
            for x in workerTimes:
                b = m // x
                delta = bisect_right(st, b) - 1
                t -= delta
                if t <= 0:
                    return True
            return False

        lo, hi = 0, 10**18
        while lo < hi:
            x = (lo + hi) // 2
            if check(x): hi = x
            else: lo = x + 1
        return hi

Q3. 统计重新排列后包含另一个字符串的子字符串数目 I

原题链接

Q3. 统计重新排列后包含另一个字符串的子字符串数目 I

思路分析

见Q4

AC代码

class Solution:
    def validSubstringCount(self, s1: str, s2: str) -> int:
        cnt1 = [0] * 26
        cnt2 = [0] * 26
        b = ord('a')
        s1 = list(map(ord, s1))
        s2 = list(map(ord, s2))
        for x in s2:
            cnt2[x - b] += 1
        res = 0
        n = len(s1)
        i = j = 0
        m = sum(1 for x in cnt2 if x)
        while i < n:
            cnt1[s1[i] - b] += 1
            if cnt1[s1[i] - b] == cnt2[s1[i] - b]:
                m -= 1
            while m == 0:
                # res += 1
                if cnt1[s1[j] - b] == cnt2[s1[j] - b]:
                    m += 1
                cnt1[s1[j] - b] -= 1
                j += 1
            res += j
            i += 1
        return res

Q4. 统计重新排列后包含另一个字符串的子字符串数目 II

原题链接

Q4. 统计重新排列后包含另一个字符串的子字符串数目 II

思路分析

滑动窗口

单调性显然,固定右端点,合法左端点越靠左

维护一个滑窗[j, i]

当我们发现滑窗内包含了s2 的字符集合,我们右收缩 j

保证 [0, j - 1] - i  都 包含s2字符集合,那么每个 i 的贡献就是 j - 1 + 1 = j

AC代码

comb = cache(comb)
class Solution:
    def validSubstringCount(self, s1: str, s2: str) -> int:
        cnt1 = [0] * 26
        cnt2 = [0] * 26
        b = ord('a')
        s1 = list(map(ord, s1))
        s2 = list(map(ord, s2))
        for x in s2:
            cnt2[x - b] += 1
        res = 0
        n = len(s1)
        i = j = 0
        m = sum(1 for x in cnt2 if x)
        while i < n:
            cnt1[s1[i] - b] += 1
            if cnt1[s1[i] - b] == cnt2[s1[i] - b]:
                m -= 1
            while m == 0:
                # res += 1
                if cnt1[s1[j] - b] == cnt2[s1[j] - b]:
                    m += 1
                cnt1[s1[j] - b] -= 1
                j += 1
            res += j
            i += 1
        return res


http://www.kler.cn/news/314791.html

相关文章:

  • springbootweb集成swagger
  • 王道考研视频——操作系统笔记
  • 海外服务器哪个速度最快且性能稳定
  • GRE隧道在实际部署中的优化、局限性与弊端
  • 排序篇(七大基于比较的排序算法)
  • 华为全联接大会HC2024 观会感
  • QMT获取可转债行情数据方法介绍!支持QMT量化软件的券商平台?
  • Oracle(140)如何创建和管理数据库角色?
  • Android14 蓝牙启动流程
  • C++编程语言:基础设施:命名空间(Bjarne Stroustrup)
  • 基于微信小程序的购物系统+php(lw+演示+源码+运行)
  • App端测——稳定性测试
  • 笔记整理—内核!启动!—linux应用编程、网络编程部分(1)API概述与文件I/O
  • 互联网技术的持续演进:从现在到未来
  • 开放的数据时代:Web3和个人隐私的未来
  • 自动化流程机器人(RPA)
  • 计算机图形学 中心画圆算法 原理及matlab代码实现
  • 『功能项目』QFrameWorkBug拖拽功能【66】
  • SpringBootWeb增删改查入门案例
  • C语言实现常见的数据结构
  • 计算机毕业设计 数字化农家乐管理平台的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 发票OFD格式转换成PDF
  • Java 使用递归方法遍历B站下载文件并解析重命名
  • Linux(ubuntu)(文件IO——fopen)
  • C++ | C++中与const相关的权限放大和缩小详解
  • 【医疗大数据】基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析
  • Spring(三)Spring事件+计划任务+条件注解+SpringAware
  • 开源网安多城联动、多形式开展网安周公益活动,传播网络安全知识
  • 中断-MCU
  • HTML粉色烟花秀