LeetCode --- 399周赛

题目列表

3162. 优质数对的总数 I

3163. 压缩字符串 III

3164. 优质数对的总数 II

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

一、优质数对的总数I

这里由于数据范围比较小,我们可以直接暴力枚举,代码如下

class Solution {
public:
    int numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        int ans = 0;
        for(auto x:nums1){
            for(auto y:nums2){
                ans += x%(y*k)==0;
            }
        }
        return ans;
    }
};

二、压缩字符串III

这题也是简单的模拟题,只要统计连续出现的字符个数,将它们拼接称字符串即可,但是要注意一旦连续出现的次数大于十,我们就需要将它进行拆分,比如有20个连续的a,拼接的字符串不能是20a,而应该是9a9a2a,代码如下

class Solution {
public:
    string compressedString(string word) {
        string ans;
        int i = 0, n = word.size();
        while(i < n){
            int j = i++;
            while(i < n && word[j] == word[i])
                i++;
            int m = i - j; // 字符word[j]连续出现的个数
            while(m >= 10){
                ans += '9';
                ans += word[j];
                m -= 9;
            }
            if(m) ans += to_string(m) + word[j];
        }
        return ans;
    }
};

三、优质数对的总数II

题目和第一题相同,但是数据范围被扩大了,不能暴力枚举了,该如何做?

题目要求nums1[i]%k*nums2[j]==0的数对个数,我们有两种思路:

1、枚举统计nums1数组元素的因子有哪些,然后遍历统计nums2[j]*k占了多少

2、枚举统计nums2数组元素*k的倍数有哪些,然后统计nums1数组元素占了多少

两种方法都可以,在代码中我们会算它们的时间复杂度

代码如下

class Solution {
    // 1、枚举统计nums1数组元素的因子有哪些,然后遍历统计nums2[j]*k占了多少
public:
    // 时间复杂度 O(n*sqrt(U/k) + m) U = max(nums1)
    long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        
        unordered_map<int,int> mp;
        // O(n*sqrt(U/k)) U = max(nums1)
        for(auto x:nums1){
            if(x%k) continue; // 首先必须是k的倍数
            x /= k;
            for(int i = 1; i*i <= x; i++){
                if(x%i) continue;
                mp[i]++;
                if(i*i!=x) mp[x/i]++;
            }
        }

        // O(m)
        long long ans = 0;
        for(auto x:nums2){
            ans += mp.count(x)?mp[x]:0;
        }
        return ans;
    }
};


class Solution {
    // 2、枚举统计nums2数组元素*k的倍数有哪些,然后遍历统计nums1[i]占了多少
public:
    // 时间复杂度 O(n+m+U*logm) U = max(nums1)
    long long numberOfPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        unordered_map<int,int> cnt1, cnt2, mp;
        int u = INT_MIN;
        for(auto x:nums1){
            u = max(u, x);
            if(x%k) continue;
            cnt1[x/k]++;
        }

        if(cnt1.empty()) return 0;

        for(auto x:nums2){
            cnt2[x]++;
        }

        // 看着像是O(n^2)的时间复杂度
        // 最坏的情况是nums2的元素全都不重复
        // 为1,2,3,....,mx  共有m个数
        //  U/1 + U/2 + U/3 + ... + U/mx
        //= U*(1+1/2+1/3+...+1/mx)
        //= U*logm
        // 1+1/2+1/3+...+1/mx 调和级数的极限,可以直接求1/x的积分,为logx
        // O(U*logm)
        long long ans = 0;
        for(auto [x,c]:cnt2){
            int s = 0;
            for(int i = x; i <= u;i += x){
                s += cnt1.count(i)?cnt1[i]:0;
            }
            ans += (long long)s*c;
        }
        return ans;
    }
};

四、不包含相邻元素的子序列的最大和

这题单独只看求不相邻元素的子序列最大和,是一道标准的打家劫舍问题,建议没写过的先去写一写,如果写过的话,其实很容易想到它可以用动态规划来做,然后你就会开始想如何进行优化,代码如下

class Solution {
    const int MOD = 1e9+7;
public:
    int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& q) {
        int n = nums.size(), m = q.size();
        int ans = 0;
        vector<long long> dp(n+2);
        for(int i=0;i<n;i++){
            dp[i+2] = max(dp[i]+nums[i],dp[i+1]);
        }
        for(auto v:q){
            int pos = v[0], x = v[1];
            nums[pos] = x;
            bool flag = false;
            for(int i=pos;i<n;i++){
                dp[i+2] = max(dp[i]+nums[i],dp[i+1]);
            }
            ans = (ans%MOD + dp.back()%MOD)%MOD;
        }
        return ans;
    }
};

但实际上这题用动态规划来写是不行的,会超时,可以去试试(java的除外,java给的时间比较宽松,官方应该会调整,这里暂且不论)。

那么这题该如何去做呢?注意,题目进行的是单点更新,区间查询的操作,显然很适合用线段树来做,那么能不能呢?这里就需要考虑一个问题:打家劫舍问题能不能用分治来做?思路如下

代码如下

// 线段树
class Solution {
    const int MOD = 1e9 + 7;
    vector<array<unsigned int,4>> t;
    // f00,f01,f10,f11
    //   0,  1,  2,  3
    void maintain(int o){
        auto& a = t[o<<1], b = t[o<<1|1];
        t[o] = {
            max(a[0]+b[2], a[1]+b[0]), // 00 = max 00+10 01+00
            max(a[0]+b[3], a[1]+b[1]), // 01 = max 00+11 01+01
            max(a[2]+b[2], a[3]+b[0]), // 10 = max 10+10 11+00
            max(a[2]+b[3], a[3]+b[1]) // 11 = max 10+11 11+01
        };
    }

    void build(vector<int>&nums,int o,int l,int r){
        if(l == r){
            // 当只有一个元素时,根据状态定义,只有f11是可以进行选择的为max(0,nums[l]),其余都无法选择为0
            t[o][3] = max(0,nums[l]);
            return;
        }
        int mid = (l+r)>>1;
        build(nums, o<<1, l, mid);
        build(nums, o<<1|1, mid + 1, r);
        maintain(o);
    }

    void update(int o,int l,int r,int i,int val){
        if(l == r){
            t[o][3] = max(val,0);
            return;
        }
        int mid = (l+r)>>1;
        if(i<=mid){
            update(o<<1,l,mid,i,val);
        }else{
            update(o<<1|1,mid+1,r,i,val);
        }
        maintain(o);
    }
public:
    int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
        int n = nums.size();
        t.resize(2<<(32 - __builtin_clz(n)));
        build(nums, 1, 0, n - 1);
        long long ans = 0;
        for(auto&q:queries){
            update(1, 0, n - 1, q[0], q[1]);
            ans += t[1][3];
        }
        return ans%MOD;
    }
};

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

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

相关文章

linnux上安装php zip(ZipArchive)、libzip扩展

安装顺序&#xff1a; 安装zip&#xff08;ZipArchive&#xff09;&#xff0c;需要先安装libzip扩展 安装libzip&#xff0c;需要先安装cmake 按照cmake、libzip、zip的先后顺序安装 下面的命令都是Linux命令 1、安装cmake 确认是否已安装 cmake --version cmake官网 未安装…

渗透测试之信息收集篇

前言 信息收集的重要性 进行渗透测试之前&#xff0c;最重要的一步就是信息收集。 信息收集可以让渗透者选择合适和准确的渗透测试攻击方式,缩短渗透测试时间。 所谓知己知彼,百战不殆&#xff0c;我们越了解测试目标&#xff0c;测试的工作就越容易。 最后能否成功渗透进入目…

【MySQL数据库】 MySQL主从复制

MySQL主从复制 MySQL主从复制主从复制与读写分离的意义主从数据库实现同步&#xff08;主从复制&#xff09;三台mysql服务器搭建主从复制&#xff0c;要求不可以用root帐号同步&#xff0c;要求第三台服务器在测试过1、2的主从复制之后进行主从复制配置四台mysql服务器(m1,s1,…

如何遍历并处理不平衡的Python数据集

目录 一、引言 二、不平衡数据集的概念与影响 三、处理不平衡数据集的策略 重采样策略 集成学习方法 代价敏感学习 一分类方法 四、Python工具与库 五、案例分析与代码实现 案例一&#xff1a;使用imbalanced-learn库进行上采样 案例二&#xff1a;使用scikit-learn…

史上最全网络安全面试题+答案

1、什么是SQL注入攻击 前端代码未被解析被代入到数据库导致数据库报错 2、什么是XSS攻击 跨站脚本攻击 在网页中嵌入客户端恶意脚本&#xff0c;常用s语言&#xff0c;也会用其他脚本语言 属于客户端攻击&#xff0c;受害者是用户&#xff0c;网站管理员也属于用户&#xf…

小白windows系统从零开始本地部署大模型全记录

大家好&#xff0c;最近两年大语言模型风靡全球&#xff0c;最近&#xff0c;不少开源大模型&#xff0c;将模型部署到自己的电脑上&#xff0c;用个性化的数据微调想必是不少人的愿望&#xff0c;这次&#xff0c;让我来分享从hugging face上下载部署chatglm3-6b中的经验。 1.…

2024-2025年跨境电商展览会计划表:共筑未来跨境行业的繁荣

-----------------------------2024年跨境电商展计划如下---------------------------- 2024年&#xff0c;2025年国内跨境电商行业将迎来一系列重大的展会活动&#xff0c;是企业展示品牌、交流趋势、拓展商机的重要平台。全国各地展会排期信息现已出炉&#xff0c;记得收藏哦…

图解PHP MySQL:轻松掌握服务器端Web开发

在当今数字化时代&#xff0c;Web开发成为了一个炙手可热的领域&#xff0c;而PHP和MySQL作为Web开发领域的两大基石&#xff0c;其重要性不言而喻。对于初学者和寻求深化理解的开发者而言&#xff0c;一本好的教材就如同灯塔一般&#xff0c;指引着他们前行。《图解PHP & …

ES升级--04--SpringBoot整合Elasticsearch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SpringBoot整合Elasticsearch1.建立项目2.Maven 依赖[ES 官方网站&#xff1a;https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/index.html](…

如何修改uni微信小程序editor组件和input组件的placeholder默认样式

需求 修改input组件的placeholder的颜色修改editor的placeholder的默认样式 input组件的placeholder样式修改 使用 placeholder-class&#xff0c;官网&#xff08;input | uni-app官网&#xff09;说明如下&#xff1a; html <input type"text" placeholder&…

layui实现表格根据数据来勾选已保存的数据

示例图 勾选一次保存后&#xff0c;每次进到查询都会看到被勾选的数据&#xff0c;代码如下&#xff1a; done: function(res, curr, count) {var groupId "[[${groupId}]]";$.ajax({url: //写后端获取数据的接口type: GET,success: function(data) {console.log(d…

STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器&#xff0c;在vector上又使用了堆算法将vector中的元素构造成堆的结构&#xff0c;因此priority_queue就是堆&#xff0c;所有需要用到堆的位置&#xff0c;都可以考虑使用priority_queue。 注意&#xff1…

Vue使用axios实现调用后端接口

准备后端接口 首先&#xff0c;我已经写好一个后端接口用来返回我的用户数据&#xff0c;并用Postman测试成功如下&#xff1a; 以我的接口为例&#xff0c;接口地址为&#xff1a;http://localhost:8080/user/selectAll 返回Json为&#xff1a; {"code": "2…

1.3纹理介绍

纹理是什么&#xff1f; 纹理的概念 一种可供着色器读写的结构化存储形式 任何图片都可以作为纹理 &#xff08;但纹理就是图片并不正确&#xff0c;因为纹理并不一定是图片&#xff0c;处理包含具体储存的信息以外&#xff0c;还会包含纹理采样的一些设置&#xff09; 纹理…

只刷题可以通过PMP考试吗?

咱们都知道&#xff0c;PMBOK那本书&#xff0c;哎呀&#xff0c;读起来确实有点费劲。所以&#xff0c;有些人就想了&#xff0c;干脆我就刷题吧&#xff0c;题海战术&#xff0c;没准儿也能过。这话啊&#xff0c;听起来似乎有点道理&#xff0c;但咱们得好好琢磨琢磨。 刷题…

卷积常用网络

目录 1.AlexNet2.VGG3.GoogleNet4.ResNet5.MobileNet 1.AlexNet AlexNet是2012年ISLVRC 2012&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;竞赛的冠军网络。 首次利用 GPU 进行网络加速训练。使用了 ReLU 激活函数&#xff0c;而不是传统的 Si…

音视频开发—FFmpeg 音频重采样详解

音频重采样&#xff08;audio resampling&#xff09;是指改变音频信号的采样率的过程。采样率&#xff08;sample rate&#xff09;是指每秒钟采集的音频样本数&#xff0c;通常以赫兹&#xff08;Hz&#xff09;或每秒样本数&#xff08;samples per second&#xff09;表示。…

如何理解和使用 this 关键字

this 关键字是许多编程语言中的一个核心概念&#xff0c;在面向对象编程&#xff08;OOP&#xff09;中尤为重要。在JavaScript、Java、C、C#等语言中&#xff0c;this 扮演着至关重要的角色。理解 this 的意义和用法&#xff0c;对于编写清晰、有效的代码至关重要。 什么是th…

OrangePi Kunpeng Pro体验——安装Hass与驱动SPI小屏幕

OrangePi Kunpeng Pro 是一款面向开发者和爱好者的高性能开发板。在本次测评中&#xff0c;主要将以前的一些代码在该开发板上实现&#xff0c;包括docker部署hass&#xff0c;引脚驱动SPI小屏幕。中间遇到了一些小小问题&#xff0c;但都成功了&#xff0c;一起来试试吧~ 一、…