Leetcode---376周赛---中位数贪心

题目列表

2965. 找出缺失和重复的数字

2966. 划分数组并满足最大差限制

2967. 使数组成为等数数组的最小代价

2968. 执行操作使频率分数最大

一、找到缺失和重复的数字

由于数据范围不是很大,可以直接暴力统计每个数字出现的次数,时间复杂度为O(n^2)

class Solution {
public:
    vector<int> findMissingAndRepeatedValues(vector<vector<int>>& grid) {
        vector<int>ans(2);
        int n=grid.size();
        vector<int>cnt(n*n+1);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cnt[grid[i][j]]++;
            }
        }

        for(int i=1;i<=n*n;i++){
            if(cnt[i]==2){
                ans[0]=i;
            }else if(cnt[i]==0){
                ans[1]=i;
            }
        }
        return ans;
    }
};

二、划分数组并满足最大差限度

这题题目说的不是很清楚,这里的"子数组"不要求连续,即与数字的顺序无关(可以看示例),所以我们可以直接排序, 然后找元素的最大最小值,简单模拟一下

class Solution {
public:
    vector<vector<int>> divideArray(vector<int>& nums, int k) {
        vector<vector<int>>ans;
        int n=nums.size();
        sort(nums.begin(),nums.end());
        for(int i=0;i<n;i+=3){
            if(nums[i+2]-nums[i]<=k)
                ans.push_back({nums[i],nums[i+1],nums[i+2]});
            else
                return {};
        }
        return ans;
    }
};

三、使数组成为等数数组的最小代价

这题的难点有两个:

1、回文数怎么处理?

2、抛开回文数,只看x,我们该如何选择x让它的代价尽可能的小?

问题1:回文数,要求左右数字对应相等,即我们只要枚举它的前半部分然后对称过去,就能得到一个回文数,我们这里选择先预处理得到数据范围内的所有回文串,具体看代码

问题2:如何选择x?这里是中位数贪心的思想,即x选择数组中的中位数最好。为什么?

结合上面两个问题的思路,我们来看看该如何写?首先我们有所有的回文数,然后我们通过中位数贪心知道,我们选择的回文数要尽可能的在中间位置,可以用二分找到附近的回文串,进行比较,找到最符合条件的

//预处理
vector<int>v;
int init=[](){
    for(int i=1;i<=10000;i*=10){//枚举回文串的前缀
        for(int j=i;j<i*10;j++){
            int x=j/10;
            int y=j;
            while(x){
                y=y*10+x%10;
                x/=10;
            }
            v.push_back(y);    
        }

        if(i<=1000){//i==10000会超范围,比如 12345 54321 数量级为1e9
            for(int j=i;j<i*10;j++){
                int x=j;
                int y=j;
                while(x){
                    y=y*10+x%10;
                    x/=10;
                }
                v.push_back(y);    
            }
        }
    }
    v.push_back(1000000001);//方便后面计算
    return 0;
}();

class Solution {
public:
    long long minimumCost(vector<int>& nums) {
        sort(nums.begin(),nums.end());//中位数贪心一定要先排序
        int n=nums.size();
        auto cost=[&](int x)->long long{
            long long s=0;
            for(int i=0;i<n;i++)
                s+=abs(x-nums[i]);
            return s;
        };
        //找中位数附近的回文串,如果n为奇数,nums[(n-1)/2]为正中间那个数,如果n为偶数,nums[(n-1)/2]为中间两个数的左边那个
        int i=lower_bound(v.begin(),v.end(),nums[(n-1)/2])-v.begin();

        //如果n为奇数,不成立(因为(n-1)/2==n/2),得找前面的回文数和它比较
        //如果n为偶数,则nums[n/2]为中间两个数的右边那个,即v[i]在两个数之间,正好符合中位数贪心,直接放回
        if(nums[n/2]>=v[i])
            return cost(v[i]);
        //否则需要比较
        return min(cost(v[i]),cost(v[i-1]));
    }
};

四、执行操作使频率分数最大

这题其实也和中位数贪心有关。为了让一个数成为出现次数最大的众数,那么我们操作的这些数肯定是相邻的,因为它们本身就很接近,这样我们将单一数字变成我们希望的众数的操作次数才会尽可能的少,才能有更多的操作次数让其他的数更有可能变成我们想要的众数,增加众数的频率。

那么选择什么数作为众数比较好呢?

如果我们选择了一些连续的数字进行操作,那么根据中位数贪心的原理,我们选择的众数最好是这些数字的中位数,这样其它数字到它的距离之和才会是最小的,也就是操作次数最少。如果操作次数>k,就需要去掉一些数,如果操作次数<=k,就增加一些数,很明显的滑动窗口

代码如下

class Solution {
    typedef long long LL;
public:
    int maxFrequencyScore(vector<int>& nums, long long k) {
        sort(nums.begin(),nums.end());
        int ans=0;
        int n=nums.size();
        vector<LL>pre(n+1);
        for(int i=0;i<n;i++)
            pre[i+1]=pre[i]+nums[i];
        function<LL(LL,LL)>check=[&](LL l,LL r)->LL{
            LL mid=(l+r)/2;//这里的中位数下标要算对
            LL left=(mid-l)*nums[mid]-(pre[mid]-pre[l]);//中位数左边的数需要的操作数
            LL right=pre[r+1]-pre[mid+1]-(r-mid)*nums[mid];//中位数右边的数需要的操作数
            return left+right;
        };

        for(int l=0,r=0;r<n;r++){
            while(check(l,r)>k)
                l++;
            ans=max(ans,r-l+1);
        }
        return ans;
    }
};

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

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

相关文章

使用css实现旋转木马HTML

使用css实现旋转木马HTML 效果图 实现代码如下 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

分享msvcr120.dll丢失怎样修复,修复msvcr120.dll文件

在使用电脑的过程中你是不是遇到过msvcr120.dll丢失的情况&#xff0c;那么有什么办法能够解决msvcr120.dll丢失的文件&#xff0c;今天的这篇文章就一个目的&#xff0c;教会大家有效的解决msvcr120.dll 丢失的问题&#xff0c;&#xff0c;接下来就教大家msvcr120.dll丢失怎样…

MR实战:分科汇总求月考平均分

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建科目平均分映射器类…

【数据结构初阶】二叉树(2)

二叉树顺序结构 1.二叉树的顺序结构及实现1.1二叉树的顺序结构 1.2 堆的概念及结构1.3 堆的实现1.3.1向上调整1.3.2向下调整1.3.3交换函数1.3.4打印1.3.5初始化1.3.6销毁1.3.7插入1.3.8删除1.3.9获得堆顶元素1.3.10判断是否为空1.3.6 堆的代码实现 1.3.2堆的创建1.3.3 建堆时间…

CV 语义分割的基础和应用 | 附源码步骤

引言 计算机视觉中的语义分割是一个引人入胜且迅速发展的领域。它涉及将图像分割为有意义的部分&#xff0c;并将每个部分分类为预定义的类别之一。本文将探讨在计算机视觉领域中语义分割的重要性、技术、应用、挑战以及未来前景。 每个像素都讲述一个故事&#xff1a;透过语义…

关于解决微服务A调用微服务B的接口获取不到数据

前提&#xff1a; 1、首先&#xff0c;你得确保写的不同微服务之间调用接口时没有任何问题的&#xff0c;可以参考我上一篇文章&#xff1b; 2、其次&#xff0c;你需要具备怎么去调试&#xff0c;怎么去定位问题。 具备以上两点其实问题就迎刃而解了。先来看看我的问题吧 问题…

Doraemon-接口自动化测试工具

这是一个自动生成接口测试测试用例的项目, 您可以通过如下方式使用他 run in python3 当你git clone 该项目后,可以通过如下命令配置你的环境 如果你习惯使用venv环境, 那么你可以进行如下操作 >>> cd doraemon >>> . venv/bin/activate >>> pip3 i…

华为防火墙双机热备

实验需求&#xff1a; 如图所示&#xff0c;PC1为公司内部网络设备&#xff0c;AR1为出口设备&#xff0c;在FW1和FW2上配置双机热备&#xff0c;当网络正常时PC1访问AR1路径为FW1-AR1&#xff0c;当FW1出现故障后&#xff0c;切换路径为FW2-AR1。 实现目的&#xff1a; 了解…

Matlab:解非线性方程组

1、基于问题求解非线性方程组 例&#xff1a; xoptimvar(x,2); %将x定义为一个二元素优化变量 eq1exp(-exp(-(x(1)x(2))))x(2)*(1x(1)^2); %创建第一个方程作为优化等式表达式 eq2x(1)*cos(x(2))x(2)*sin(x(1))1/2; %创建第二个方程作为优化等式表达式 probe…

nextTick的使用

场景&#xff1a; 左边的树有被选中项&#xff0c;则显示右边的内容&#xff0c;且清除右边表格的被选中项 代码大概就是 选中左边的树然后执行 this.$refs.treeRef.setCurrentRow(); // 取消表格高亮行 然后报错&#xff1a; 解决&#xff1a; 在外面包一层this.$nextTi…

AI可以一键生成的年终工作总结思维导图了!(内附10张年终总结模版)

月交替&#xff0c;斗转星移。不知不觉&#xff0c;2023年的进度条已经所剩无几了&#xff01; 又到了一年一度写年终总结的时候了&#xff0c;很多小伙伴是不是又开始发愁了&#xff0c;ProcessOn 告诉你不用担心&#xff0c; 我们今年上线了&#xff0c;AI一键生成各行各业年…

挑战与应对:迅软科技探讨IT企业应对数据泄密危机的智慧之路

随着信息技术的快速发展&#xff0c;软件IT行业面临着前所未有的数据安全挑战。黑客攻击、病毒传播、内部泄密等安全威胁层出不穷&#xff0c;给企业的核心资产和运营带来严重威胁。同时&#xff0c;国家对于数据安全的法律法规也日益严格&#xff0c;要求企业必须采取更加有效…

亚马逊云科技创业加速器,帮助企业重塑业务并加速生成式AI之旅

经济蓬勃发展的时代&#xff0c;每一个初创企业都可能成为未来独角兽。随着创新科技快速发展、层出不穷&#xff0c;生成式AI席卷全球&#xff0c;各行各业游戏规则面临重构&#xff0c;也为初创企业带来巨大机遇。 初创公司值得信赖的云计算厂商 全球排名前1000的独角兽&#…

Java多线程技术五——单例模式与多线程-备份

1 概述 本章的知识点非常重要。在单例模式与多线程技术相结合的过程中&#xff0c;我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明&#xff0c;线程与某些技术相结合中&#xff0c;我们要考虑的事情会…

ComfyUI如何中文汉化

comfyui中文地址如下&#xff1a; https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translationhttps://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Translation如何安装&#xff1f; 1. git安装 进入项目目录下的custom_nodes目录下&#xff0c;然后进入控制台&#xff0c;运…

ppt美化的的几个小技巧

最简单的提升方式&#xff1a;加一层相对透明的矩形底色。 1、图标设置为透明的 方法&#xff1a;双击图片-》格式-》颜色-》设置透明色 2、使用渐变填充透明度配合作为文本底色。 1&#xff09;如透明度为90%&#xff0c;颜色会变浅&#xff0c;然后作为文本的底色。 2&…

iPad绘画之旅:从小白到文创手账设计的萌系简笔画探索

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 iPad的出现&#xff0c;不仅改变了我们对电子设…

HarmonyOS共享包HAR

共享包概述 OpenHarmony提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;Harmony Shared Package&#xff09;动态共享包。 HAR与HSP都是为了实现代码和资源的共享&#xff0c;都可以包含代码、C库、资源和配…

【Java基础】Java中异常分类,他们之间的区别?

&#x1f341;Java中异常分哪两类 &#x1f341;Java中异常类&#x1f341;受检异常&#x1f341;非受检异常 &#x1f341;拓展知识仓&#x1f341;什么是Throwable&#x1f341;Error和Exception的区别和联系&#x1f341; 列举几个常用的RuntimeException&#x1f341;Java异…

索引是如何提高查询性能的?

引言问&#xff1a;如何提高一条查询SQL的性能&#xff1f;答&#xff1a;最常用的方式就是加「索引」。问&#xff1a;索引为什么就能提高查询性能&#xff1f;答&#xff1a;索引就像一本书的目录&#xff0c;用目录查当然很快。问&#xff1a;为什么通过目录就能提高查询速度…