[LeetCode周赛复盘] 第 105 场双周赛20230528

news2025/1/11 11:10:58

[LeetCode周赛复盘] 第 105 场双周赛20230528

    • 一、本周周赛总结
    • 6395. 购买两块巧克力
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 6394. 字符串中的额外字符
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 6393. 一个小组的最大实力值
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 6464. 最大公约数遍历
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 参考链接

一、本周周赛总结

  • 史上发挥最好的一次了,可惜T3空集wa了一次。
  • T1 贪心。
  • T2 dp。
  • T3 状压/dfs/dp。
  • T4 分解质因数+并查集。
    在这里插入图片描述

6395. 购买两块巧克力

6395. 购买两块巧克力

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 贪心的取最便宜的两块。

3. 代码实现

class Solution:
    def buyChoco(self, prices: List[int], money: int) -> int:
        prices.sort()
        ans = money - sum(prices[:2])
        return ans if ans >= 0 else money

6394. 字符串中的额外字符

6394. 字符串中的额外字符

1. 题目描述

在这里插入图片描述

2. 思路分析

dp

  • 由于是分割子串,那么讨论最后一段的长度即可。
  • 令f[i]为前i个人字符最少剩下的字符。
  • 若后缀s[j…i]在字典里,则f[i]=f[j-1]。
    • 另外f[i]最差=f[i-1]+1。
  • 实现时令下标右移一位方便处理。

  • 另外可以用trie优化成n方。

3. 代码实现

class Solution:
    def minExtraChar(self, s: str, dictionary: List[str]) -> int:
        n = len(s)
        dc = set(dictionary)
        f = [0]+[inf]*n 
        for i in range(n):
            f[i+1] = f[i]+1
            for j in range(i,-1,-1):
                if s[j:i+1] in dc:
                    f[i+1] = min(f[i+1], f[j])
        return f[-1]

6393. 一个小组的最大实力值

6393. 一个小组的最大实力值

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 看到数据量立刻就想暴力。
  • 之前有一道数据量20的状压会被卡,这次不会了。

  • 当然最优解是dp或者贪心。
    在这里插入图片描述

3. 代码实现

class Solution:
    def maxStrength(self, nums: List[int]) -> int:
        n = len(nums)
        ans = -inf
        # for i in range(1,1<<n):
        #     s = 1
        #     for j in range(n):
        #         if i>>j&1:
        #             # print(j,nums[j])
        #             s *= nums[j]
        #     ans = max(ans,s)
            # print(i,ans,s)
        
        # def dfs(i,s,cnt):
            
        #     nonlocal ans 
        #     if cnt:
        #         ans = max(ans,s)
        #     if i==n:
        #         return 
        #     dfs(i+1,s,cnt)
        #     dfs(i+1,s*nums[i],cnt+1)
        # dfs(0,1,0)
        # return ans 
        mx = mn = nums[0]
        for v in nums[1:]:
            t = mx 
            mx = max(mx,v,v*mx,v*mn)
            mn = min(mn,v,v*t,v*mn)
        return mx

6464. 最大公约数遍历

6464. 最大公约数遍历

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 其实就是某些点之间有边,问最后是不是连通图(只有一个连通块)。
  • n方建图当然不行,但是可以连虚拟节点,即把每个数字和它的所有质因数连起来。
  • 那么开并查集连通对应下标和质因数即可。质因数作为虚拟节点,向右移动1e5位。因此并查集开大点。

  • 连值也可以,需要特判count(1)>1 return false。
  • 这样并查集就可以开小点,会快一些。
    在这里插入图片描述

3. 代码实现

class PrimeTable:
    def __init__(self, n: int) -> None:
        self.n = n
        self.primes = primes = []  # 所有n以内的质数
        self.min_div = min_div = [0] * (n + 1)  # md[i]代表i的最小(质)因子
        min_div[1] = 1

        # 欧拉筛O(n),顺便求出min_div
        for i in range(2, n + 1):
            if not min_div[i]:
                primes.append(i)
                min_div[i] = i
            for p in primes:
                if i * p > n: break
                min_div[i * p] = p
                if i % p == 0:
                    break

        # # 埃氏筛O(nlgn),由于切片的原因,仅标记质数的场景下比线性筛表现更好。
        # is_primes = [1] * (n + 1)
        # is_primes[0] = is_primes[1] = 0  # 0和1不是质数
        # for i in range(2, int((n + 1) ** 0.5) + 1):
        #     if is_primes[i]:
        #         is_primes[i * i::i] = [0] * ((n - 1 - i * i) // i + 1)
        # self.primes = [i for i, v in enumerate(is_primes)]

    def is_prime(self, x: int):
        """检测是否是质数,最坏是O(sqrt(x)"""
        if x < 3: return x == 2
        if x <= self.n: return self.min_div[x] == x
        for i in range(2, int(x ** 0.5) + 1):
            if x % i == 0: return False
        return True

    def prime_factorization(self, x: int):
        """分解质因数,复杂度
        1. 若x>n则需要从2模拟到sqrt(x),如果中间x降到n以下则走2;最坏情况,不含低于n的因数,则需要开方复杂度
        2. 否则x质因数的个数,那么最多就是O(lgx)"""
        n, min_div = self.n, self.min_div
        for p in range(2, int(x ** 0.5) + 1):
            if x <= n: break
            if x % p == 0:
                cnt = 0
                while x % p == 0: cnt += 1; x //= p
                yield p, cnt
        while 1 < x <= n:
            p, cnt = min_div[x], 0
            while x % p == 0: cnt += 1; x //= p
            yield p, cnt
        if x >= n and x > 1:
            yield x, 1

    def get_factors(self, x: int):
        """求x的所有因数,包括1和x"""
        factors = [1]
        for p, b in self.prime_factorization(x):
            n = len(factors)
            for j in range(1, b + 1):
                for d in factors[:n]:
                    factors.append(d * (p ** j))
        return factors

    def mr_is_prime(self, x):
        """
        Miller-Rabin 检测. 检测x是否是质数,置信度: 1 - (1/4)^k. 复杂度k*log^3
        但是longlong以内可以用k==3或7的代价,换取100%置信度
        https://zhuanlan.zhihu.com/p/349360074
        """
        if x < 3 or x % 2 == 0:
            return x == 2
        if x % 3 == 0:
            return x == 3

        u, t = x - 1, 0
        while not u & 1:
            u >>= 1
            t += 1
        ud = (2, 325, 9375, 28178, 450775, 9780504, 1795265022)  # long long 返回用这个7个数检测100%正确
        # ud = (2, 7, 61)  # int 返回用这3个数检测100%正确
        # for _ in range(k):
        #     a = random.randint(2, x - 2)
        for a in ud:
            v = pow(a, u, x)
            if v == 1 or v == x - 1 or v == 0:
                continue
            for j in range(1, t + 1):
                v = v * v % x
                if v == x - 1 and j != t:
                    v = 1
                    break
                if v == 1:
                    return False
            if v != 1:
                return False
        return True

class DSU:
    """基于数组的并查集"""
    def __init__(self, n):
        self.fathers = list(range(n))
        self.size = [1] * n  # 本家族size
        self.edge_size = [0] * n  # 本家族边数(带自环/重边)
        self.n = n
        self.set_count = n  # 共几个家族

    def find_fa(self, x):
        fs = self.fathers
        t = x
        while fs[x] != x:
            x = fs[x]
        while t != x:
            fs[t], t = x, fs[t]
        return x

    def union(self, x: int, y: int) -> bool:
        x = self.find_fa(x)
        y = self.find_fa(y)

        if x == y:
            self.edge_size[y] += 1
            return False
        # if self.size[x] > self.size[y]:  # 注意如果要定向合并x->y,需要干掉这个;实际上上边改成find_fa后,按轶合并没必要了,所以可以常关
        #     x, y = y, x
        self.fathers[x] = y
        self.size[y] += self.size[x]
        self.edge_size[y] += 1 + self.edge_size[x]
        self.set_count -= 1
        return True

pt = PrimeTable(10**5+5)
class Solution:
    def canTraverseAllPairs(self, nums: List[int]) -> bool:
        # if nums.count(1) >= 2:
        #     return False
        n = len(nums)
        dsu = DSU(2*10**5+5)
        for i,v in enumerate(nums):
            for p,k in pt.prime_factorization(v):
                dsu.union(i,p+100000)
        f = dsu.find_fa(0)
        for i in range(1,n):
            if dsu.find_fa(i) != f:
                return False 
        return True     

参考链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试需求分析有哪些?怎么做?

目录 性能测试必要性评估 常见性能测试关键评估项如下&#xff1a; 性能测试工具选型 性能测试需求分析 性能测试需求评审 性能测试需求分析与传统的功能测试需求有所不同&#xff0c;功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性&#xff…

【Go语言从入门到实战】并发篇

Go语言从入门到实战 — 并发篇 协程 Thread vs Groutine 相比之下&#xff0c;协程的栈大小就小很多了&#xff0c;创建起来也会更快&#xff0c;也更节省系统资源。 一个 goroutine 的栈&#xff0c;和操作系统线程一样&#xff0c;会保存其活跃或挂起的函数调用的本地变量…

2023 年面向初学者的 5 大自由写作技巧

在这篇文章中&#xff0c;我们将讨论初学者的自由写作技巧 译自&#xff1a;https://jitendra.co/freelance-writing-tips-for-beginners/ 比较平易近人&#xff0c;在做独立站并且自己写原创时候可以参考下&#xff0c;面对的甲方爸爸不同而已 最初的兼职活动最终成为我生活中…

Docker下安装MySQL,PostgreSQL,SQL Server(包含离线和在线安装)

1 MySQL 1.1 离线安装 1.1.1 加载镜像 使用ftp工具将安装包上传至服务器最大目录下&#xff0c;这里以根目录为最大目录举例 键入加载镜像命令&#xff1a;docker load -i 镜像包名称 docker load -i mysql80.tar使用docker images命令查看已经加载的镜像&#xff0c;如上…

【利用ChatGPT学习英语口语(包括如何安装插件的详细教程)】

内容目录 一、插入ChatGPT语音播放插件1. 打开谷歌浏览器——右上角三点——更多工具——扩展程序2. 点击扩展程序三个横杠——打开chrome 应用商店3. 搜索Voice Control for ChatGPT——点击如下图第一个——添加至Chrome——添加扩展程序4. 成功安装&#xff0c;打开ChatGPT有…

【大数据hive】hive视图与物化视图使用详解

目录 一、hive中的视图 二、hive视图语法与操作 2.1 数据准备 2.2 创建视图 2.2.1 创建普通的视图 2.2.2 基于视图创建视图 2.3 查看视图定义 2.4 使用视图 2.5 删除视图 2.6 更改视图属性 2.7 更改视图定义 三、使用视图的好处 3.1 只将真实表中特定的列数据提…

线程同步模式的设计思路

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 …

ISCC2023 擂台misc wp

刚想起来发 文章目录 雪豹哦&#xff1f;摩斯密码&#xff1f;ඞG9的钢琴曲BNG听你心跳里的狂Brain Games user-id&#xff1a;芝士雪豹 雪豹 这道题没啥意思&#xff0c;存粹为了套拿450分。知识点属于重复知识点&#xff0c;见谅&#xff1a; 拿到附件&#xff0c;用360解…

分布式网络通信框架(十)——Mprpc框架使用示例

发布一个服务提供远程调用方法的流程 若想要发布一个服务提供一些远程调用方法&#xff0c;步骤如下&#xff1a; 先在protobuf文件中添加参数和返回值的message 类型&#xff0c;然后再添加希望提供的服务 service 类型&#xff08;如UserServiceRpc&#xff09;和 其中的方…

傅里叶级数和傅里叶变换之间的关系推理及应用

傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具&#xff0c;它们之间有密切的关系。 什么是傅里叶级数 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号&#xff0c;可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展…

【ChatGPT】ChatGPT快速生成短视频

1.chatGPT剪映 chatGPT生成文本后通过剪映图文成片 这次用了new bing&#xff1a;Chatbot AI 在线网页版 (atmob.cn) 打开剪映-图文成片 把new bing生成的文本粘贴过来&#xff0c;点击生成视频。 生成好了&#xff0c;是这样 剪映自动生成的&#xff0c;最后还是得手工改改&…

ChatGPT生成Excel统计公式

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349; ChatGPT生成Excel统计公式 文章目录 &#x1f350;问题引入&#x1f350;具体操作&#x1f433;结语 &#x1f350;问题引入…

如何使用 service account 获取 keycloak 的用户信息

Keycloak 是一个开源的权限管理和认证系统。使用 Keycloak 可以让开发者专注于解决业务的核心问题。获取用户信息是权限管理和认证系统需要的基本功能。Service Account 是OAuth 2.0推荐的系统服务使用的账户&#xff0c;开发者可以通过 Keycloak 的 Service Account 来让自己的…

【嵌入式烧录/刷写文件】-3.2-S19/Hex文件转换为Bin文件

案例背景(共6页精讲)&#xff1a; 该篇将告诉您&#xff1a;如何使用Vector HexView工具&#xff0c;对一个Intel Hex或Motorola S-record(S19/SREC/mot/SX)文件转换为bin文件。 目录 1 Intel Hex&#xff0c;Motorola S-record(S19/SREC/mot/SX)&#xff0c;Bin文件之间的差…

基于SpringBoot养老院管理系统

目录 一、项目介绍 二. 运行环境 三、项目技术 四、部署项目 五、项目运行 六、项目展示 五、项目下载 一、项目介绍 基于springboot的养老院管理系统拥有多种角色账号&#xff1a;管理员和用户 管理员&#xff1a;管理员管理、用户管理、健康管理、病例方案管理、药品…

计算机网络面试八股文

网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。最全面的Java面试网站&#xff1a;最全面的Java面试网站 五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&a…

文生视频综述

文字生成视频当前挑战 和发展现状_哔哩哔哩_bilibili今天我们聊了什么是 text to video&#xff0c;它的原理和目前的研究进展。text to video 是一种将文本转换为视频的技术&#xff0c;它可以通过图像处理、语音识别和自然语言处理等技术来实现。目前&#xff0c;text to vid…

【C语言】刷题训练营 —— 每日一练(十三)

文章目录 前言 BC123 小乐乐找最大数BC124 小乐乐是否被叫家长BC125 小乐乐转换成绩BC126 小乐乐算多少人被请家长BC127 小乐乐算最高分BC128 小乐乐计算求和BC129 小乐乐计算函数BC130 小乐乐查找数字BC131 KiKi学程序设计基础BC132 KiKi算期末成绩完结 前言 大家好&#xff…

计算机体系结构标量处理机

先行控制技术 缓冲深度的设计方法 以先行指令缓冲栈为例。 假设缓冲深度为 D 1 D_1 D1​&#xff0c;考虑以下两种极端情况。 &#xff08;1&#xff09;先行指令缓冲栈已经充满&#xff0c;此时指令流出速度最快&#xff0c;例如连续分析RR型指令 &#xff0c;设这种指令序…

[元带你学: eMMC协议详解 12] Speed Mode 选择

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 2000字&#xff0c; 介绍了各种Speed Mode 选择的方法&#xff0c; 需要按照一定的步骤&#xff0c; 重点需要掌握HS400, High Speed 和 HS20…