LeetCode --- 399周赛

news2024/11/17 12:31:04

题目列表

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;
    }
};

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

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

相关文章

STP19NF20 丝印 19NF20 场效应管19A 200V 直插 TO-220

STP19NF20 功率MOSFET的应用领域相当广泛&#xff0c;主要包括&#xff1a; 1. 电源管理&#xff1a;用于高效率电源管理电路&#xff0c;如直流-直流转换器和交流-直流电源适配器。 2. 开关模式电源&#xff08;SMPS&#xff09;&#xff1a;在需要高效能和紧凑型尺寸的开关…

汽车悬架分为哪几类

汽车悬架分为哪几类 1)汽车的悬架系统可根据结构分为两种:独立悬架和非独立悬架,独立悬架根据构造又可以分为CDC运动悬架(CDC电磁悬架系统)和空气悬架; 2)当前比较火热的空气悬架,是独立悬架的一种; 3)前轮主要使用麦弗逊式独立悬架 和 双叉臂悬架,后轮主要使用多…

本特利330130-040-01-00 PLC模块深度解析 询价联系ID

本特利330130-040-01-00 PLC模块深度解析 在工业自动化领域&#xff0c;准确、高效的数据采集和监控是确保生产安全、提高生产效率的关键。本特利&#xff08;Bently Nevada&#xff09;作为全球知名的工业自动化和监控设备制造商&#xff0c;其生产的330130-040-01-00 PLC模块…

实验一 MyBatis框架实验

一、实验环境 Windows10、IDEA2023.1.2、mybatis 3.5.6、DataGr 二、实验目的与要求 1、掌握 MyBatis 开发环境的搭建&#xff1b; 2、熟悉 MyBatis 的开发步骤&#xff1b; 3、掌握 MyBatis 基本对象、配置文件和映射文件的使用&#xff1b; 4、掌握 MyBatis 动态 SQL 开…

基于 DCT 的图像滤波

需求分析 对于图像去噪这一需求&#xff0c;我们可以通过DCT&#xff08;离散余弦变换&#xff09;算法来实现。DCT是一种基于频域的变换技术&#xff0c;可以将图像从空间域转换为频域&#xff0c;然后通过滤波等处理方式进行去噪。 针对这一需求&#xff0c;我们需要进行以下…

Android --- Room数据库(Java)

概念 Room 是一个持久性库&#xff0c;属于 Android Jetpack 的一部分。Room 是 SQLite 数据库之上的一个抽象层。SQLite 使用一种专门的语言 (SQL) 来执行数据库操作。Room 并不直接使用 SQLite&#xff0c;而是负责简化数据库设置和配置以及与数据库交互方面的琐碎工作。此…

使用Python类的构造函数和析构函数

1、问题背景 当使用Python类时&#xff0c;可以使用构造函数和析构函数来初始化和清理类实例。构造函数在创建类实例时自动调用&#xff0c;而析构函数在删除类实例时自动调用。 在上面的代码示例中&#xff0c;Person类具有一个构造函数__init__和一个析构函数__del__。构造…

PHP MySQL图解学习指南:开启Web开发新篇章

PHP曾经是最流行的Web开发语言&#xff0c;许多世界领先的网站(如Facebook、维基百科和WordPress)都是用它编写的。PHP运行在Web服务器端&#xff0c;通过使用存储在MySQL数据库中的数据&#xff0c;使得网站可以为每一位访问者显示不同的定制页面。书中采用简单、直观的图示化…

大模型智力升级:AI的未来之路

大模型的发展引领了人工智能的新时代&#xff0c;其强大的数据处理和学习能力在医疗、金融、教育等众多领域取得了令人瞩目的成就。然而&#xff0c;随之而来的挑战也不容忽视。尽管大模型在特定任务上展现出了卓越的性能&#xff0c;但它们在理解复杂语境、处理未见情况的能力…

Linux内网中安装jdk1.8详细教程

本章教程,主要介绍如何在内网环境中配置JDK1.8环境变量 一、下载Linux版压缩包 下载地址:https://www.oracle.com/java/technologies/downloads/#java8 下载完成之后,通过XFTP等工具,将安装包上传到内网服务器 二、安装配置步骤 1、解压压缩包 tar -zxvf /usr/local/jdk-…

[Qt]关于QListWidget、QScrollArea 为什么在QDesigner上设置了之后界面上仍然不生效的问题

前言 最近做了一些有关QListWidget和QScrollArea的控件&#xff0c;我去&#xff0c;这两个控件是真的坑&#xff0c;明明我在QDesigner的操作界面上对这两个控件的界面进行了修改&#xff0c;但是编译出来的软件就是看上去什么都没有&#xff0c;很坑&#xff0c;Gpt也没解决…

html 引用vue3 element 首次加载缩成一团 挤在一起

问题&#xff1a;原生html引用vue,element plus 分析&#xff1a; vue.js, element脚本过大&#xff0c;首次加载网络慢的话&#xff0c;会是缩在这里&#xff0c;没完全渲染 解决&#xff1a; 没加载之前&#xff0c;不显示div&#xff0c;显示一个加载提示语 改动地方app…

CatDDoS僵尸网络与DNSBomb攻击:DDOS攻击最新变种

在近期的网络安全领域&#xff0c;两大严峻挑战浮出水面&#xff0c;为中国乃至全球的网络防护体系敲响了警钟。中国安全厂商奇安信的X实验室团队揭露了一波名为CatDDoS的恶意软件攻击浪潮&#xff0c;与此同时&#xff0c;一种创新且隐蔽的拒绝服务攻击技术——DNSBomb&#x…

揭秘IDM:数字资产管理的未来之星

在当今数字化时代&#xff0c;数字资产管理的重要性日益凸显。随着科技的飞速发展&#xff0c;越来越多的企业和个人开始关注如何有效管理和保护他们的数字资产。在这个过程中&#xff0c;IDM&#xff08;身份管理系统&#xff09;逐渐成为了热门话题。IDM作为一种新兴的技术手…

云原生网关 MSE-Higress

云原生网关 MSE-Higress 什么是云原生网关MSEMSE测评产品文档产品能力产品控制台 MSE与其他网关 什么是云原生网关MSE 在体验云原生网关 MSE-Higress功能之前&#xff0c;先了解一下什么是云原生网关 MSE&#xff0c;简单的说就是MSE就是遵循开源 Ingress/Gateway API 标准的下…

探数API分享-全球电价一览:谁最高,谁最低?

全球家庭用电价格的平均水平约为0.139美元/千瓦时&#xff0c;这是根据2021年12月的统计数据得出的。在这个平均水平之上&#xff0c;有一些国家的家庭用电价格远超过这个数值&#xff0c;特别是在欧洲的一些发达国家。 丹麦、荷兰、德国、英国、西班牙、比利时等国家的家庭用…

Token验证流程、代码示例、优缺点和安全策略,一文告诉你。

Token和Session都是用于身份验证和授权的机制&#xff0c;而且Token渐渐成为主流&#xff0c;有不少小伙伴对token的认识不全&#xff0c;这里给大家分享下。 一、什么是Token Token是一种用于身份验证和授权的令牌&#xff0c;通常用于在客户端和服务器之间进行安全的通信。…

小型水库水雨情和大坝安全监测解决方案

小型水库水雨情和大坝安全监测解决方案 小型水库作为重要的水资源管理和防洪调蓄设施&#xff0c;在保障农业灌溉、居民饮水及防洪安全方面发挥着不可或缺的作用。然而&#xff0c;由于其规模限制&#xff0c;小型水库往往在水雨情监测和大坝安全评估方面面临资源和技术的双重…

项目经理催开发进度的5大技巧

项目经理在催促开发进度时&#xff0c;采用的技巧对于项目成功至关重要。这不仅影响到项目的按时完成&#xff0c;还关系到团队的士气、效率和最终产品的质量。项目经理如果不去主动催促开发进度&#xff0c;可能导致项目延期&#xff0c;团队偏离原定路线&#xff0c;工作重点…

ASTRONEER异星探险家服务器开服多人联机

1、购买后登录服务器 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、获取数字IP地址 使用IP 地址查询网站将服务器IP地址填入后点击查询&#xff08;查询的时候将地址冒号后方的数字以及冒…