2170. 使数组变成交替数组的最少操作数 (Medium)
问题描述
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:
输入:nums = [3,1,3,2,4,3]
输出:3
解释:
使数组变成交替数组的方法之一是将该数组转换为 [3,1,3,1,3,1] 。
在这种情况下,操作数为 3 。
可以证明,操作数少于 3 的情况下,无法使数组变成交替数组。
示例 2:
输入:nums = [1,2,2,2,2]
输出:2
解释:
使数组变成交替数组的方法之一是将该数组转换为 [1,2,1,2,1].
在这种情况下,操作数为 2 。
注意,数组不能转换成 [2,2,2,2,2] 。因为在这种情况下,nums[0] ==
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
,结果res
为nums.size() - max_num1 - max_num2
,否则res = std::min(nums.size() - max_num1 - second_num2, nums.size() - second_num1 - max_num2)
。
代码
class Solution {
public:
// map,内部元素为pair<int, int> 数字以及数字出现个数
int minimumOperations(vector<int> &nums) {
auto cmp = [&](pair<int, int> &p1, pair<int, int> &p2) {
return p1.second < p2.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq1(cmp);
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> pq2(cmp);
unordered_map<int, int> mp1, mp2;
for (int i = 0; i < nums.size(); i += 2) {
mp1[nums[i]]++;
if (i + 1 < nums.size()) {
mp2[nums[i + 1]]++;
}
}
int max_1 = 0, second_1 = 0;
int max_num1 = 0, second_num1 = 0;
int max_2 = 0, second_2 = 0;
int max_num2 = 0, second_num2 = 0;
for (auto &p1 : mp1) {
if (p1.second >= max_1) {
second_1 = max_1;
second_num1 = max_num1;
max_1 = p1.second;
max_num1 = p1.first;
} else if (p1.second >= second_1) {
second_1 = p1.second;
second_num1 = p1.first;
}
}
for (auto &p2 : mp2) {
if (p2.second >= max_2) {
second_2 = max_2;
second_num2 = max_num2;
max_2 = p2.second;
max_num2 = p2.first;
} else if (p2.second >= second_2) {
second_2 = p2.second;
second_num2 = p2.first;
}
}
if (max_num1 != max_num2) {
return nums.size() - max_1 - max_2;
}
return std::min(nums.size() - max_1 - second_2, nums.size() - max_2 - second_1);
}
};
2170. 使数组变成交替数组的最少操作数 (Medium)的更多相关文章
- NSArray与NSMutableArray 数组与可变数组
1.NSArray 是一个父类,NSMUtableArray是其子类,他们构成了OC的数组.2.NSArray的创建NSArray * array = [[NSArray alloc]initWith ...
- C#中的数组,多维数组和交错数组
想研究一些面向对象的东西,也许是代码写得还不够多.感觉还不好,看那些教程,不是嫌太水就是太难看不懂.心情很是落寞 不过再怎样也要坚持每天发一篇博客. 这篇来说一下C#中的数组,多维数组,交错数组的一些 ...
- C语言数组:C语言数组定义、二维数组、动态数组、字符串数组
1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...
- python科学计算_numpy_线性代数/掩码数组/内存映射数组
1. 线性代数 numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行: matrix对象由matrix类创建,其四则运算都默认采用矩阵运算, ...
- 函数,参数数组params与数组参数,结构函数
1.函数 static 返回值类型 函数名(形参1,形参2,...){ 函数体; return 返回值; } 无返回值,则static void 函数名(){ } stat ...
- EXCEL VBA——数组,使用数组提升程序效率
数组的存在价值就是让代码提速. 数组和非数组的差异只在于数据的保存和读取方式不同,虽然操作这些数据的方法或者函数并没有不同,但是保存与读取上的差异却使VBA代码在处理数据时实现了质的飞跃.在完成相同工 ...
- C语言学习笔记 (004) - 数组名和数组首地址(转)
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...
- NSArray与NSMutableArray 数组与可变数组的创建和遍历 复习
1.NSArray 是一个父类,NSMUtableArray是其子类,他们构成了OC的数组. 2.NSArray的创建 NSArray * array = [[NSArray alloc]initWi ...
- JS数组专题1️⃣ ➖ 数组扁平化
一.什么是数组扁平化 扁平化,顾名思义就是减少复杂性装饰,使其事物本身更简洁.简单,突出主题. 数组扁平化,对着上面意思套也知道了,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层 ...
- 数组(ArrayPool数组池、Span<T>结构)
前言 如果需要使用相同的类型的多个对象,就可以使用集合和数组,这一节主要讲解数组,其中会重点涉及到Span<T>结构和ArrayPool数组池.我们也会先涉及到简单的数组.多维数组.锯齿数 ...
随机推荐
- dfs-入门模板
模板 void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝 ret ...
- JavaSE——this关键字
this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题) 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量 方法的形参没有与成员变量同名,不带 ...
- Windows下安装和使用Masscan
http://zone.secevery.com/article/1098 0x00 前言Masscan号称最快的互联网端口扫描器,本文来探测一下Masscan在Windows下的安装和使用.mass ...
- jekins+svn
1.jekins安装可以看jekins+shell随笔. 2.安装svn. yum -y install subversion 3.配置相关文件 mkdir 家目录 cd 到家目录修改conf下三 ...
- win10如何设置共享媒体流?
一.win10设置媒体流共享 1 电脑开机后,点击右下角的"网络连接-网络和Internet设置". 2 进入设置界面后,点击"网络和共享中心". ...
- OnMicro BLE应用方案|蓝牙语音遥控器-OM6621E
随着物联网技术不断发展,家用电器往智能化方向持续迭代,使用红外遥控器这种传统的互动方式已经满足不了实际的使用需求,蓝牙语音遥控器作为人机交互新载体,逐渐取代传统红外遥控器成为家居设备的标配. 相比于传 ...
- 【Pr】如何将音频剪成多段批量导出
如何将音频剪成多段批量导出 需要软件: Pr, Adobe Media Encoder (时间线窗口中) 用剃刀将音频割成多段 (时间线窗口中) 选中音频右键 | 嵌套 | 输入名字 (嵌套快捷键:A ...
- LightOJ - 1162 Min Max Roads
LightOJ - 1162 Min Max Roads 题解:在线倍增LCA和模拟ST表 让我们求从\(u->v\)最短路径上的边权最大值和边权最小值,那么我们可以利用倍增思想,类似其\(fa ...
- Python后端基础知识总结
1.所谓可变类型与不可变类型是指:是否可以在不改变原来数据的引用地址基础上,去修改数据.如果能直接修改那么就是可变,否则是不可变 不可变对象:该对象所指向的内存中的值不能被改变.当改变某个变量时候,由 ...
- Delphi as 和 is 的使用
as就是把某个类型对象转换为某个指定类型,这样方便使用指定类型中的一些成员. is就是判断某个对象是不是某个类型,可以筛选出我们需要的对象. 下面是一个as is 的实例代码,该代码同时也实现了两种方 ...