【大顶堆】个人练习-Leetcode-2170. Minimum Operations to Make the Array Alternating

news/2024/7/18 20:54:58 标签: leetcode, 算法, 职场和发展

题目链接:https://leetcode.cn/problems/minimum-operations-to-make-the-array-alternating/description/

题目大意:给一个数组nums[],要求将其变为alternating数组,即其所有奇数下标的元素相等,所有偶数下标的元素相等,且奇数元素下标的元素不等于偶数下标的元素。

思路:很明显贪心就行,保留奇数下标元素中,出现次数第一大和第二大的元素及其次数(保留至第二大是因为要满足奇偶下标元素不等)。同样保留偶数下标元素中,出现次数第一大和第二大的元素及其次数。然后算一算总数减去两个第一大元素次数即可,如果碰见元素相等,就顺延至第二大。顺延奇数的还是偶数的都试一下。如果所有元素都相等(也就是没有第二大),那么就没法减,不用操作。

主要还是写起来比较麻烦,刚开始自己维护了个保留第一大和第二大的方法,虽然过了,但看着太丑陋了,就换成了用一个大顶堆来维护的方法。此外,考虑到数组只有一个元素的情况,特殊处理。这样就保证了其他情况下,奇数和偶数下标都至少有一个第一大元素。

此外,因为priority_queue对于pair的比较是从first开始的,我们在构建大顶堆时,将哈希表中的first, second要互换一下再放进堆中,因为这样才是让【出现次数】被用来比较。

完整代码

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        if (nums.size() == 1)
            return 0;
        unordered_map<int, int> a;
        unordered_map<int, int> b;
        priority_queue<pair<int, int>> ha;
        priority_queue<pair<int, int>> hb;

        for (int i = 0; i < nums.size(); i+=2)
            a[nums[i]]++;
        for (int i = 1; i < nums.size(); i+=2)
            b[nums[i]]++;
        
        for (auto it = a.begin(); it != a.end(); it++) 
            ha.emplace(make_pair(it->second, it->first));
        for (auto it = b.begin(); it != b.end(); it++) 
            hb.emplace(make_pair(it->second, it->first));

        auto a1 = ha.top();
        auto b1 = hb.top();
        ha.pop();
        hb.pop();
        int ans1 = nums.size() - a1.first;
        if (a1.second != b1.second) 
            ans1 -= b1.first;
        else {
            if (!hb.empty()) {
                ans1 -= hb.top().first;
            }
        }

        int ans2 = nums.size() - b1.first;
        if (a1.second != b1.second) 
            ans2 -= a1.first;
        else {
            if (!ha.empty()) {
                ans2 -= ha.top().first;
            }
        }
           
        return min(ans1, ans2);
    }
};

http://www.niftyadmin.cn/n/5544450.html

相关文章

游戏行业网络安全:挑战、防御与实践

引言 随着游戏行业的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;尤其是DDoS攻击、SQL注入、零日攻击等威胁&#xff0c;对游戏公司的运营安全和玩家体验造成了严重影响。本文将深入探讨游戏行业面临的网络安全挑战&#xff0c;并提出一系列实用的防御策略&#xff…

Rust入门实战 编写Minecraft启动器#2建立资源模型

首发于Enaium的个人博客 我们需要声明几个结构体来存储游戏的资源信息&#xff0c;之后我们需要将json文件解析成这几个结构体&#xff0c;所以我们需要添加serde依赖。 serde { version "1.0", features ["derive"] }资源相关asset.rs use serde::De…

react apollo hooks

1、创建ApolloProvider来包装整个程序 <ApolloProvider client{client}><App /> <ApolloProvider> 2、useQuery查询 工作方式usequery将返回一个数组 const {要返回的对象} useQuery(传入参数) 实例 const query gqlquery name {whatever {field}} e…

svg-captcha 生成图片验证码

svg-captcha - npm (npmjs.com) npm install --save svg-captchaconst express require(express); const {getCaptchaService} require("../service/captchaService"); const router express.Router();// 生成验证码 router.get(/, async function (req, res, nex…

Linux安装elasticsearch单机版

一、检查内核 uname -a uname -m 二、下载版本 下载版本选择自己服务器相同的内核版本 我这边是aaech64 ES下载地址 Kibana 下载地址 二、上传服务器解压 tar -xvf elasticsearch-8.14.1-linux-aarch64.tar.gz 三、安装ES 因为ES不能用root用户启动先创建用户 #新增 es …

昇思25天打卡营-mindspore-ML- Day19-应用实践-生成式-DCGAN生成漫画头像

学习了如何使用DCGAN模型生成动漫头像。 数据集&#xff1a; 本次实验使用了70,171张96*96像素的动漫头像图片作为训练数据。 算法原理&#xff1a; DCGAN&#xff08;深度卷积对抗生成网络&#xff09;是一种基于GAN&#xff08;生成对抗网络&#xff09;的图像生成模型。它…

linux kthread任务管理

目录 一、linux 创建内核线程1.1 kthread_create1.2 kthread_create_worker kthread_queue_work 二、设置线程优先级和调度策略2.1 sched_setscheduler2.2 调度策略 一、linux 创建内核线程 1.1 kthread_create 在 linux 中&#xff0c;可以使用 kthread_create 接口创建内核…

智能化代码审查系统设计

设计一个智能化代码审查系统&#xff0c;特别是针对Java开发&#xff0c;需要综合考虑多个维度来提升代码质量、提高审查效率&#xff0c;并促进团队间的协作。以下是该系统设计的关键要素和功能特性&#xff1a; 系统架构 客户端-服务器架构&#xff1a;前端提供友好的Web界面…