力扣 第 399 场周赛 解题报告 | 珂学家 | 调和级数 + 分块DP


前言

image.png

T1. 优质数对的总数 I

题型: 签到

class Solution:
    def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:
        res = 0
        for v1 in nums1:
            for v2 in nums2:
                if v1 % (v2 * k) == 0:
                    res += 1
        return res

T2. 压缩字符串 III

思路: 模拟

感觉引入一个栈,操作更加的方便

当然加限制的分组循环也可以

class Solution:
    def compressedString(self, word: str) -> str:
        stk = []
        for i, c in enumerate(word):
            if len(stk) == 0 or stk[-1][0] != c or stk[-1][1] == 9:
                stk.append([c, 1])
            else:
                stk[-1][1] += 1
        return ''.join(map(lambda x: str(x[1]) + x[0], stk))

T3. 优质数对的总数 II

思路: 调和级数

很典的结论题,时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
∑ i = 1 i = n 1 / i = l o g ( n ) \sum_{i=1}^{i=n} 1/i = log(n) i=1i=n1/i=log(n)

class Solution:
    def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:        
        mp1 = Counter()
        for v in nums1:
            if v % k == 0:
                mp1[v//k] += 1
        if len(mp1) == 0:
            return 0
        mz = max(mp1.keys())
        
        res = 0
        mp2 = Counter(nums2)
        for (k1, v1) in mp2.items():
            for i in range(1, mz // k1 + 1):
                res += v1 * mp1[i * k1]
        return res

T4. 不包含相邻元素的子序列的最大和

思路: 分块 + DP

因为数据规模不大, O ( n ∗ q ) O(\sqrt{n} * q) O(n q) 在合理的范围内

所以用分块,思路更加的纯朴和简洁。

每次更新块大小内的状态

然后按块间重算最后的整体解

DP 引入块状态, 表示首尾的0-1状态

具体来讲

image.png

class Solution {

    static long inf = Long.MIN_VALUE / 10;

    static class Block {
        int l, r;
        int[] arr;

        long[][][] pre;

        int n;

        public Block(int l, int r, int[] arr) {
            this.l = l;
            this.r = r;
            this.arr = arr;

            this.n = r - l + 1;
            pre = new long[n][2][2];
        }

        public void modify() {
            pre[0][0][0] = 0;
            pre[0][0][1] = inf;
            pre[0][1][0] = inf;
            pre[0][1][1] = arr[l];

            for (int i = 1; i < n; i++) {
                pre[i][0][0] = Math.max(pre[i - 1][0][0], pre[i - 1][0][1]);
                pre[i][1][0] = Math.max(pre[i - 1][1][0], pre[i - 1][1][1]);
                pre[i][0][1] = pre[i - 1][0][0] + arr[l + i];
                pre[i][1][1] = pre[i - 1][1][0] + arr[l + i];
            }
        }

        long[][] val() {
            return pre[n - 1];
        }

    }

    public int maximumSumSubsequence(int[] nums, int[][] queries) {

        int n = nums.length;
        int z = (int)Math.sqrt(n);
        int m = (n + z - 1) / z;

        Block[] blocks = new Block[m];
        for (int i = 0; i < m; i++) {
            blocks[i] = new Block(i * z, Math.min((i + 1) * z - 1, n - 1), nums);
            blocks[i].modify();
        }

        long mod = (long)1e9 + 7;
        long res = 0;
        for (int i = 0; i < queries.length; i++) {
            int[] q = queries[i];
            int p = q[0], x = q[1];
            int idx = p / z;
            nums[p] = x;
            blocks[idx].modify();

            long[][] dp = new long[m][2];
            dp[0][0] = Math.max(blocks[0].val()[0][0], blocks[0].val()[1][0]);
            dp[0][1] = Math.max(blocks[0].val()[0][1], blocks[0].val()[1][1]);
            for (int j = 1; j < m; j++) {
                long[][] next = blocks[j].val();

                dp[j][0] = Math.max(dp[j - 1][0] + Math.max(next[0][0], next[1][0]), dp[j - 1][1] + next[0][0]);
                dp[j][1] = Math.max(dp[j - 1][0] + Math.max(next[0][1], next[1][1]), dp[j - 1][1] + next[0][1]);
            }

            long tmp = Math.max(dp[m - 1][0], dp[m - 1][1]);
            res = (res + tmp) % mod;
            res = (res % mod + mod) % mod;
        }

        return (int)res;
    }
}

写在最后

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于PHP的物业管理的设计与实现

第1章 绪论... 1 1.1 研究背景与意义... 1 1.2 国内外发展现状... 2 第2章 关键技术介绍... 3 2.1 PHP语言... 3 2.2 MySQL数据库... 3 2.3 Zend框架... 4 2.4 B/S架构... 4 第3章 系统需求分析... 5 3.1 可行性分析... 5 3.1.1 技术可行性分析... 5 3.1.2 经济可行…

解决updateByExample时属性值异常的问题(部分属性值没有使用占位符?进行占位,而是变成了属性的名称)

目录 场景简介代码片断实体类 报错信息排查原因解决测试过程解决方案 场景简介 1、程序将mybatis框架升级为3.5.9版本后执行updateByExample方法时报错 代码片断 Condition condition new Condition(MbCcsSessionConfig.class); condition.createCriteria().andEqualTo(&quo…

知识分享:隔多久查询一次网贷大数据信用报告比较好?

随着互联网金融的快速发展&#xff0c;越来越多的人开始接触和使用网络贷款。而在这个过程中&#xff0c;网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么&#xff0c;隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…

【Python】 Django 框架如何支持百万级日访问量

基本原理 Django 是一个高级的 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。Django 遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式&#xff0c;允许开发者通过编写更少的代码来构建高质量的 Web 应用程序。Django 自带了许多内置功能&#xf…

《最新出炉》系列入门篇-Python+Playwright自动化测试-42-强大的可视化追踪利器Trace Viewer

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 在我们日常执行自动化测试工作的过程中&#xff0c;经常会遇到一些偶发性的bug&#xff0c;但是因为bug是偶发性的&#xff0c;我们不一定每次执行都能复现&#xff0c;所以我…

深度学习模型

深度学习模型 深度学习网络模型是人工智能领域的重要分支&#xff0c;它通过模拟人脑神经网络的工作方式来处理数据并识别模式。以下是对深度学习网络模型的一些主要类型的详细概述&#xff1a; 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09; 结构&a…

【Unity实战篇 】| Unity实现 文本框可以自适应大小,到达最大宽度之后再缩小字体

前言 在文本框可以自适应大小拉伸的前提下,增加一个最大限制宽度,使其到达最大宽度后 再启用 Best Fit 实现自适应改变文字大小以适应文本框的大小。 【Unity实战篇 】 | Unity实现 Text文本框可以自适应大小,到达最大宽度之后再缩小字体 在Unity中经常会用到文本组件的自…

Bonfire - [Asset for Zibra Smoke Fire]

Bonfire资产支持URP、BRP和HDRP渲染管道,可以用作VFX或游戏元素。 这种环境资产可用于增强视觉故事性,以及创建自定义游戏机制,为虚拟世界增加互动性和真实性。 全交互:使用Zibra Smoke&Fire进行实时烟雾模拟。 易于使用:您所需要做的就是购买资产并将其放入场景中。不…

【NOIP2015普及组复赛】题3:求和

题3&#xff1a;求和 【题目描述】 一条狭长的纸带被均匀划分出了 n n n 个格子&#xff0c;格子编号从 1 1 1 到 n n n。每个格子上都染了一种颜色 c o l o r i color_i colori​ &#xff08;用 [ 1 &#xff0c; m ] [1&#xff0c;m] [1&#xff0c;m]当中的一个整数表…

DM Hw6

Hw6 聚类 1ab 2abcd 3abcde 456789 1 a b 一个点不来自某个特定簇的概率是 1 − 1 K 1-\frac{1}{K} 1−K1​ 对所有 2 K 2K 2K 个点都不来自该簇的概率是 ( 1 − 1 K ) 2 K (1-\frac{1}{K})^{2K} (1−K1​)2K 则 至少一个点来自该簇的概率为 1 − ( 1 − 1 K ) 2 K 1-(1-…

Jmeter环境安装(超级简单)

Jmeter的安装是非常简单的&#xff0c;只需要将下载的安装包解压后&#xff0c;就可以运行了&#xff01;&#xff01; 一、首先要下载Jmeter 1.1、官网下载&#xff1a; 下载最新版&#xff1a;https://jmeter.apache.org/download_jmeter.cgi https://jmeter.apache.org/…

第22讲:RBD块存储COW克隆解除父子镜像的依赖关系

RBD块存储COW克隆解除父子镜像的依赖关系 1.COW镜像克隆存在的依赖关系 在前面使用copy-on-write机制基于快照做出来的链接克隆&#xff0c;与快照依赖性很强&#xff0c;如果快照损坏或者丢失&#xff0c;那么克隆的镜像将无法使用&#xff0c;使用这个镜像创建的虚拟机也会…

什么是容器:从基础到进阶的全面介绍

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

深入分析 Android Activity (六)

文章目录 深入分析 Android Activity (六)1. Activity 的权限管理1.1 在 Manifest 文件中声明权限1.2 运行时请求权限1.3 处理权限请求结果1.4 处理权限的最佳实践 2. Activity 的数据传递2.1 使用 Intent 传递数据2.2 使用 Bundle 传递复杂数据 3. Activity 的动画和过渡效果3…

Windows Subsystem for Linux (WSL)查看在线发行版并在终端安装

在 Windows Subsystem for Linux (WSL) 中&#xff0c;你可以使用以下命令来查看在线可用的 Linux 发行版&#xff1a; 列出可用的 Linux 发行版&#xff1a; 使用以下命令查看可以通过在线商店获取的 Linux 发行版列表&#xff1a; wsl --list --online或者&#xff0c;你也可…

2024年上半年软件设计师试题及答案(回忆版)

目录 基础知识选择题案例题1.缺陷识别的数据流图2.球队、球员、比赛记录的数据库题3.用户、老师、学生、课程用例图4.算法题5.程序设计题 基础知识选择题 树的节点&#xff0c;度为4的有4个&#xff0c;度为3的有8个&#xff0c;度为2个有6个&#xff0c;度为1的有10个&#x…

1915springboot VUE 宠物寄养平台系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE 宠物寄养平台系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码…

基于ERNIE Bot SDK开发智趣灯谜会游戏

项目背景 猜灯谜是中国传统节日元宵节中一种深受人们喜爱的民间游戏&#xff0c;它集趣味性、知识性和艺术性于一体&#xff0c;是中华文化的重要组成部分。猜灯谜&#xff0c;顾名思义&#xff0c;就是通过解读谜面来猜测谜底&#xff0c;谜底通常是各种物品、现象或概念。 猜…

STM32无源蜂鸣器播放音乐

开发板&#xff1a;野火霸天虎V2 单片机&#xff1a;STM32F407ZGT6 开发软件&#xff1a;MDKSTM32CubeMX 文章目录 前言一、找一篇音乐的简谱二、确定音调三、确定节拍四、使用STM32CubeMX生成初始化代码五、代码分析 前言 本实验使用的是低电平触发的无源蜂鸣器 无源蜂鸣器是…

微信小程序文本框输入显示已经输入的字数

我们遇到这样的需求&#xff0c;就是微信小程序的输入框下面需要显示输入的字数&#xff1a; 我们通常会使用bindinput事件&#xff0c;让显示的字数等于value的长度&#xff0c;看下面的图&#xff1a; 但在实践中&#xff0c;真机测试中&#xff0c;我们会发现以下问题: 这个…