问题描述

2170. 使数组变成交替数组的最少操作数 (Medium)

给你一个下标从 0 开始的数组 nums ,该数组由 n 个正整数组成。

如果满足下述条件,则数组 nums 是一个 交替数组

  • nums[i - 2] == nums[i] ,其中 2 <= i <= n - 1
  • nums[i - 1] != nums[i] ,其中 1 <= i <= n - 1

在一步 操作 中,你可以选择下标 i 并将 nums[i] 更改任一 正整数。

返回使数组变成交替数组的 最少操作数

示例 1:

  1. 输入:nums = [3,1,3,2,4,3]
  2. 输出:3
  3. 解释:
  4. 使数组变成交替数组的方法之一是将该数组转换为 [3,1,3,1,3,1]
  5. 在这种情况下,操作数为 3
  6. 可以证明,操作数少于 3 的情况下,无法使数组变成交替数组。

示例 2:

  1. 输入:nums = [1,2,2,2,2]
  2. 输出:2
  3. 解释:
  4. 使数组变成交替数组的方法之一是将该数组转换为 [1,2,1,2,1].
  5. 在这种情况下,操作数为 2
  6. 注意,数组不能转换成 [2,2,2,2,2] 。因为在这种情况下,nums[0] ==
  7. nums[1],不满足交替数组的条件。

提示:

  • 1 <= nums.length <= 10⁵
  • 1 <= nums[i] <= 10⁵

解题思路

贪心,分别记录nums的奇数索引的元素中出现最多的两个元素及其出现次数,记为max_2, max_num2, second_2, second_num2,以及nums的偶数索引的元素中出现最多的两个元素及其出现次数,记为max_1, max_num1, second_1, second_num1,如果max_1 != max_2,结果resnums.size() - max_num1 - max_num2,否则res = std::min(nums.size() - max_num1 - second_num2, nums.size() - second_num1 - max_num2)

代码

  1. class Solution {
  2. public:
  3. // map,内部元素为pair<int, int> 数字以及数字出现个数
  4. int minimumOperations(vector<int> &nums) {
  5. auto cmp = [&](pair<int, int> &p1, pair<int, int> &p2) {
  6. return p1.second < p2.second;
  7. };
  8. priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq1(cmp);
  9. priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq2(cmp);
  10. unordered_map<int, int> mp1, mp2;
  11. for (int i = 0; i < nums.size(); i += 2) {
  12. mp1[nums[i]]++;
  13. if (i + 1 < nums.size()) {
  14. mp2[nums[i + 1]]++;
  15. }
  16. }
  17. int max_1 = 0, second_1 = 0;
  18. int max_num1 = 0, second_num1 = 0;
  19. int max_2 = 0, second_2 = 0;
  20. int max_num2 = 0, second_num2 = 0;
  21. for (auto &p1 : mp1) {
  22. if (p1.second >= max_1) {
  23. second_1 = max_1;
  24. second_num1 = max_num1;
  25. max_1 = p1.second;
  26. max_num1 = p1.first;
  27. } else if (p1.second >= second_1) {
  28. second_1 = p1.second;
  29. second_num1 = p1.first;
  30. }
  31. }
  32. for (auto &p2 : mp2) {
  33. if (p2.second >= max_2) {
  34. second_2 = max_2;
  35. second_num2 = max_num2;
  36. max_2 = p2.second;
  37. max_num2 = p2.first;
  38. } else if (p2.second >= second_2) {
  39. second_2 = p2.second;
  40. second_num2 = p2.first;
  41. }
  42. }
  43. if (max_num1 != max_num2) {
  44. return nums.size() - max_1 - max_2;
  45. }
  46. return std::min(nums.size() - max_1 - second_2, nums.size() - max_2 - second_1);
  47. }
  48. };

2170. 使数组变成交替数组的最少操作数 (Medium)的更多相关文章

  1. NSArray与NSMutableArray 数组与可变数组

    1.NSArray 是一个父类,NSMUtableArray是其子类,他们构成了OC的数组.2.NSArray的创建NSArray * array = [[NSArray alloc]initWith ...

  2. C#中的数组,多维数组和交错数组

    想研究一些面向对象的东西,也许是代码写得还不够多.感觉还不好,看那些教程,不是嫌太水就是太难看不懂.心情很是落寞 不过再怎样也要坚持每天发一篇博客. 这篇来说一下C#中的数组,多维数组,交错数组的一些 ...

  3. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  4. python科学计算_numpy_线性代数/掩码数组/内存映射数组

    1. 线性代数 numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行: matrix对象由matrix类创建,其四则运算都默认采用矩阵运算, ...

  5. 函数,参数数组params与数组参数,结构函数

    1.函数 static 返回值类型 函数名(形参1,形参2,...){        函数体;        return 返回值; } 无返回值,则static void 函数名(){ } stat ...

  6. EXCEL VBA——数组,使用数组提升程序效率

    数组的存在价值就是让代码提速. 数组和非数组的差异只在于数据的保存和读取方式不同,虽然操作这些数据的方法或者函数并没有不同,但是保存与读取上的差异却使VBA代码在处理数据时实现了质的飞跃.在完成相同工 ...

  7. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  8. NSArray与NSMutableArray 数组与可变数组的创建和遍历 复习

    1.NSArray 是一个父类,NSMUtableArray是其子类,他们构成了OC的数组. 2.NSArray的创建 NSArray * array = [[NSArray alloc]initWi ...

  9. JS数组专题1️⃣ ➖ 数组扁平化

    一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...

  10. 数组(ArrayPool数组池、Span<T>结构)

    前言 如果需要使用相同的类型的多个对象,就可以使用集合和数组,这一节主要讲解数组,其中会重点涉及到Span<T>结构和ArrayPool数组池.我们也会先涉及到简单的数组.多维数组.锯齿数 ...

随机推荐

  1. fastlane iOS打包 安装与使用

    1.安装 fastlane sudo gem install fastlane 2.进入工程目录下 终端输入 fastlane init 接着输入3 然后control + c退出 接着编写 Fast ...

  2. win10安装双版本mysql的方法

    因为app作业缘故,之前装的mysql8.0版本无法兼容因此打算再装一个5.7版本的mysql,历经3,4天终于成功,现记录下这血一般的教训 首先官网下再mysql5.7.37的安装包 下载地址htt ...

  3. SSL certificate problem: unable to get local issuer certificate 错误解决

    终端报了如下错误git SSL certificate problem: unable to get local issuer certificate 这个问题是由于没有配置信任的服务器HTTPS验证 ...

  4. 修改jar包内容

    列举jar包内容 # 列举jar包所有文件 jar tvf test.jar 从jar包中提取文件 # 从test.jar中提取test.jar/test.txt到test.txt jar xvf t ...

  5. 【SSO单点系列】(5):CAS4.0 之JDBC

    deployerConfigContext.xml 修改对应添加以下代码 <bean id="SearchModeSearchDatabaseAuthenticationHandler ...

  6. Linux-curl下载报错解决方法

    报错提示: curl: (92) HTTP/2 stream 1 was not closed cleanly before end of the underlying stream ==> E ...

  7. “初始化 Java 工具”期间发生了内部错误, java.lang.NullPointerException

    今天刚打开eclipse就报了这个错误,我怀疑是昨晚想关电脑的时候,关闭eclipse太快,没有等待工作空间保存就关了电脑的缘故 错误如图: (图片来自下方链接博客,因为忘记截图了) 我百度后按照提示 ...

  8. python 小顶堆

    from heapq import *heap=[]for i in range(10,1,-1): heappush(heap,i)print(heap)print(heappop(heap))pr ...

  9. 基于DFA算法实现的敏感词过滤

    本文转自浅析敏感词过滤算法(C++),自己也在其基础上根据自己的情况做了一点修改. https://blog.csdn.net/u012755940/article/details/51689401? ...

  10. nginx 可视化配置平台

    nginx是一个高性能的HTTP和反向代理服务器.在部署项目中,经常会用到,但是配置是比较麻烦的,很容易出错,今天大叔给大家推荐一个非常好用的可视化平台 -- nginx-gui. 项目功能 配置管理 ...