LeetCode --- 412周赛

news2024/11/13 9:29:46

题目列表

3264. K 次乘运算后的最终数组 I

3266. K 次乘运算后的最终数组 II

3265. 统计近似相等数对 I

3267. 统计近似相等数对 II

一、K次乘预算后的最终数组 I & II

 I 数据范围比较小,可以暴力模拟,代码如下

class Solution {
public:
    vector<int> getFinalState(vector<int>& nums, int k, int multiplier) {
        int n = nums.size();
        while(k--){
            int pos = 0;
            for(int i = 1; i < n; i++){
                if(nums[pos] > nums[i])
                    pos = i;
            }
            nums[pos] *= multiplier;
        }
        return nums;
    }
};

II 的数据范围变大了,暴力会超时,需要优化,如何做?

这里我们需要找到一些规律:

1、假设数组nums中只有一个数字x,我们直接返回 x * multiplier ^ k

2、假设数组nums中有两个数字 x,y (x <= y)

1) x 太小(或者 k 太小 或者 multiplier 太小),导致 x * multiplier ^ k < y

2) x 和 y 相近,x 乘以 m (m < k) 个的 multiplier 后,就会大于 y,即 x * multiplier ^ m > y,那么下一次 y * multiplier 一定大于  x * multiplier ^ m (我们对两边同除multiplier,可得y > x*multiplier^(m-1) 成立),所以后面的乘法操作就是这两个数字交替进行

3、假设数组nums中有三个数字 x,y,z (x <= y <= z),当 z 成为最小值,x 变成 X,y变成Y 时,假设 z <= Y <= X,由 2 可知,z * multiplier 必然大于 Y 和 X,下一个 Y * multiplier 必然大于 z,下一个 X * multiplier 必然大于 Y,同理后面的乘法操作就是这三个数字交替进行

......

我们不难得出结论:当数组中的最大值成为最小值的时候,剩余的 操作次数 会被均匀的分配给每个数字,如果除不尽的化,会按照大小顺序分配多余的1次乘法操作

那么在数组中的最大值成为最小值之前的操作,我们只需要模拟即可,代码如下

class Solution {
    const int MOD = 1e9 + 7;
    using LL = long long;
public:
    LL POW(LL x, LL y){
        LL res = 1;
        while(y){
            if(y & 1) res = (res * x) % MOD;
            x = (x * x) % MOD;
            y >>= 1; 
        }
        return res;
    }
    vector<int> getFinalState(vector<int>& nums, int k, int multiplier) {
        if(multiplier == 1) return nums;
        int n = nums.size();
        int mx = ranges::max(nums);
        priority_queue<pair<LL,int>,vector<pair<LL,int>>,greater<>>pq;
        // 建堆
        for(int i = 0; i < n; i++)
            pq.emplace(nums[i], i);
        // while循环的时间复杂度,考虑最坏情况 k = 1e9 ,muiliplier = 2
        // nums = {1,1,1,1,...,1e9}, U = max(nums), n = len(nums)
        // 即每一个 1 都需要 logU 的时间变得 >= 1e9
        // 时间复杂度为 min(k, nlognlogU) = nlognlogU
        while(k && mx != pq.top().first){
            auto [x, i] = pq.top(); pq.pop();
            pq.emplace(x * multiplier, i);
            k--;
        }
        int j = 0;
        int p1 = POW(multiplier, k/n) % MOD;
        int p2 = POW(multiplier, k/n + 1) % MOD;
        while(pq.size()){
            auto [x, i] = pq.top(); pq.pop();
            nums[i] = x % MOD * (j < k % n ? p2 : p1) % MOD;
            j++;
        }
        return nums;
    }
};

二、统计近似相等数对 I

题目一数据范围比较小,可以直接暴力模拟,代码如下

class Solution {
public:
    int countPairs(vector<int>& nums) {
        int n = nums.size(), ans = 0;
        auto check = [&](int i, int j)->bool{
            int x = nums[i], y = nums[j], ret = 0;
            int cnt1[10]{}, cnt2[10]{};
            while(x || y){
                if(x % 10 != y % 10){
                    cnt1[x % 10]++;
                    cnt2[y % 10]++;
                    ret++;
                }
                x /= 10, y /= 10;
            }
            for(int i = 0; i < 10; i++)
                if(cnt1[i] != cnt2[i])
                    return false;
            return ret == 0 || ret == 2;
        };
        for(int i = 0; i < n; i++){
            for(int j = i + 1; j < n; j++){
                ans += check(i, j);
            }
        }
        return ans;
    }
};

三、统计近似相等数对 II

这种找匹配个数的题,很容易想到两数之和,用哈希表,边记录数字出现次数,边统计结果,这题也是同理,我们边记录数字出现次数,边统计当前遍历到的数字能变成哪些数字,在将这些数字的出现次数加入答案即可,代码如下

class Solution {
public:
    int countPairs(vector<int>& nums) {
        ranges::sort(nums);
        int ans = 0;
        unordered_map<int,int>mp;
        for(int x: nums){
            unordered_set<int> st = {x}; // 记录 x 能变成哪些数字
            string s = to_string(x);
            int m = s.size();
            for(int i = 0; i < m; i++){
                for(int j = i + 1; j < m; j++){
                    swap(s[i], s[j]);
                    st.insert(stoi(s));
                    for(int p = i + 1; p < m; p++){
                        for(int q = p + 1; q < m; q++){
                            swap(s[p], s[q]);
                            st.insert(stoi(s));
                            swap(s[p], s[q]); // 注意要恢复现场
                        }
                    }
                    swap(s[i], s[j]); // 注意要恢复现场
                }
            }
            for(auto e: st)
                ans += (mp.contains(e) ? mp[e] : 0);
            mp[x]++;
        }
        return ans;
    }
};

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

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

相关文章

Day52 | dijkstra(堆优化版)Bellman_ford 算法

dijkstra&#xff08;堆优化版&#xff09; 题目 47. 参加科学大会 47. 参加科学大会&#xff08;第六期模拟笔试&#xff09; 题目描述 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。 小明的起点是第一个车站&a…

vscode 未定义标识符 “uint16_t“C/C++(20) 但是可以顺利编译

这是没有指定编译器的原因 解决方法&#xff1a; 打开 或c_cpp_properties.json&#xff0c;添加编译器

★ 算法OJ题 ★ 力扣611 - 有效三角形的个数

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;椎名日和将和大家一起做一道双指针算法题--有效三角形的个数~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 二 算法解析 给三个数&#xff0c;判断是否能构成三角形的条件&#xff1a;两个较小的数相加大于…

机器学习数学公式推导之高斯分布

文章目录 1、介绍引入1.1 频率派的观点1.2 贝叶斯派的观点1.3 小结 2、数学基础2.1 二阶中心矩2.2 样本方差2.3 高斯分布2.3.1 一维情况 MLE2.3.2 多维情况 本文参考 B站UP: shuhuai008 跳转 &#x1f339;&#x1f339; 1、介绍引入 在统计学和概率论中&#xff0c; P ( x ∣ …

史上最全的MybatisPlus学习教程从入门到精通

一、MybatisPlus是什么 1.1 MyBatis-Plus简介 MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;它在MyBatis的基础上进行了增强&#xff0c;但并没有改变原有的MyBatis框架。MyBatis-Plus的主要目标是简化开发和提高开发效率。它提供了诸如分…

源码阅读-SpirngBoot Mybatis 自动配置

MybatisPlusAutoConfiguration ObjectProvider#getIfAvailable ObjectProvider为我们提供了拓展&#xff0c;我们可以自定义一些插件或者类型转换器&#xff0c;同时也可以定义一些Customizer用来配置SqlSessionFactoryBean,MybatisPlusProperties等。 通过源码我们可以看到最…

Redis从入门到入门(上)

1.Redis概述 文章目录 1.Redis概述1.1 什么是Redis1.2 Redis的应用场景 2.Linux下Redis的安装与使用2.1 Redis下载2.2 Redis的启动2.3 Redis配置2.4 连接Redis 1.1 什么是Redis Redis是用C语言开发的一个开源的高性能键值对&#xff08;key-value&#xff09;数据库&#xff0…

数学建模--K-Means聚类分析

目录 1.聚类分析步骤 1.1简单介绍 1.2两个概念 1.3几种距离 1.4更新质心 1.5终止条件 2.归一化处理 3.肘部法则 4.搭建K-Means分析模型 5.选择最佳K值 6.绘制3D图形 1.聚类分析步骤 1.1简单介绍 K-Means聚类分析是属于聚类分析的一种&#xff0c;这个数据机器学习的…

YOLOv8改进 | Neck篇 | YOLOv8引入Slim-Neck(超轻量)

1. Slim-Neck介绍 摘要:目标检测是计算机视觉中重要的下游任务。 对于车载边缘计算平台来说,巨大的模型很难达到实时检测的要求。 而且,由大量深度可分离卷积层构建的轻量级模型无法达到足够的精度。 我们引入了一种新的轻量级卷积技术 GSConv,以减轻模型重量但保持准确性。…

《软件工程导论》(第6版)第4章 形式化说明技术 复习笔记

第4章 形式化说明技术 一、概述 按照形式化的程度&#xff0c;可以把软件工程使用的方法划分成非形式化、半形式化和形式化3类。用自然语言描述需求规格说明&#xff0c;是典型的非形式化方法。用数据流图或实体联系图建立模型&#xff0c;是典型的半形式化方法。所谓形式化…

idea的springboot里面的resources是什么

在IDEA&#xff08;IntelliJ IDEA&#xff09;中的Spring Boot项目中&#xff0c;resources目录扮演着非常重要的角色。这个目录主要用于存放项目的非代码资源&#xff0c;包括但不限于配置文件、静态资源文件&#xff08;如图片、CSS、JavaScript等&#xff09;、模板文件&…

YOLO缺陷检测学习笔记(2)

YOLO缺陷检测学习笔记&#xff08;2&#xff09; 残差连接1. **YOLO 的残差连接结构**2. **YOLO 使用残差连接的目的**3. **YOLO 中的残差块**4. **YOLOv3 和 YOLOv4 的残差连接架构** YOLO网络架构概述1. 特征提取网络2. 预测头&#xff08;Detection Head&#xff09;3. 后处…

Android CCodec Codec2 (五)C2Param - Ⅲ

这一节我们来看看简单参数的定义方式 1、C2SimpleValueStruct Codec2框架提供了模板类C2SimpleValueStruct来帮助我们定义非灵活数组的简单参数。C2SimpleValueStruct的定义如下&#xff1a; template<typename T> struct C2SimpleValueStruct {T value; ///< simpl…

阿里 “通义灵码” 真的 “灵吗”,全保姆级实操

最近很多朋友&#xff0c;都在关注阿里公测的“通义灵码”&#xff0c;我索性也安装了&#xff0c;准备看看它真的有说的那么“灵吗”&#xff1f; 一、安装 官网&#xff1a;https://tongyi.aliyun.com/lingma/ 安装方式&#xff1a;https://tongyi.aliyun.com/lingma/downl…

Redis 集群:引领企业级 NoSQL 数据库新潮流

一 、关系型数据库和 NoSQL 数据库 在当今的数据库领域&#xff0c;关系型数据库和非关系型数据库都占据着重要的地位。 关系型数据库 关系型数据库是建立在关系模型基础上的数据库&#xff0c;它通过表与表之间的关系来存储和管理数据。 特点 数据结构清晰&#xff1a;以二…

“微服务革命”之后...

曾几何时&#xff0c;我记得我的手指疯狂地敲打键盘&#xff0c;与庞大而杂乱的代码库搏斗。那是巨石的时代&#xff0c;代码就像古老的城堡一样&#xff0c;由一块块石头砌成一个令人印象深刻的庞然大物。 几年过去了&#xff0c;时代变了。开发人员口中的流行语变成了“微服…

基于STM32校车安全监控系统的设计(论文+源码+实物)

1 方案设计 根据设计要求&#xff0c;本设计校车安全监控系统的设计以STM32F103单片机作为主控制器&#xff0c;通过MQ传感器实现异常气体的检测&#xff0c;当异常气体浓度异常时会通过继电器打开车窗进行通风&#xff0c;以保证舒适的环境&#xff0c;通过红外传感器用于监…

EXO:StandardNode _process_tensor

目录 EXO:StandardNode _process_tensor EXO:StandardNode _process_tensor 这段代码是在处理某种分片(sharding)逻辑时使用的,特别是在处理大型模型或数据处理任务时,这些任务被分割成多个较小的部分(即分片)来并行处理。这里,代码片段关注于根据特定的调试级别(DEBU…

大数据处理从零开始————1.Hadoop介绍

1. 大数据时代背景 1.1 大数据时代到来 在微信上&#xff0c;随手点的一个赞&#xff1b;在百度上&#xff0c;随手输入的搜素关键词&#xff1b;在健康记录应用上&#xff0c;每天所产生的微信步数这些都是数据。我们每人每天都在产生大量数据。人类近些年所产生的数据比过去…

【设计模式】创建型模式——简单工厂模式

文章目录 一、创建型模式1. 包含模式1.1 工厂模式1.2 建造者模式1.3 原型模式1.4 单例模式 二、工厂模式1. 概要1.1 意图1.2 主要解决问题1.3 何时使用1.4 如何解决1.5 关键代码1.6 使用场景1.7 优点1.8 缺点1.9 简单工厂实现 2. 简单工厂模式2.1 模式结构2.2 实例2.3 模式定义…