当前位置:网站首页>2170. 使数组变成交替数组的最少操作数
2170. 使数组变成交替数组的最少操作数
2022-08-02 19:53:00 【沉沉沉小姐】
题目链接:https://leetcode.cn/problems/minimum-operations-to-make-the-array-alternating/
题目描述:
给你一个下标从 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 <= 105
1 <= nums[i] <= 105
解题思路:
- 奇数下标和偶数下标的数字不能相同
- 奇数下标的数字一致,偶数下标的数字一致
- 使用列表长度-奇数中出现最多的数的次数-偶数中出现最多的数的次数
注:可能奇数和偶数的出现频率最高的数字一致,则需考虑次高选项
代码:
class Solution(object):
def minimumOperations(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
count = 0 # 计算奇数项与偶数项(二者值不同)出现频率最高数字的总和
count1 = 0
count2 = 0
n = len(nums)
if len(nums) == 1: # 出现[1]则无需操作
return 0
else:
# 计算偶数项出现频率最高的前两项
a_most = Counter([y for x,y in enumerate(nums) if x%2 == 0]).most_common(2)
# 计算奇数项出现频率最高的前两项
b_most = Counter([y for x,y in enumerate(nums) if x%2 != 0]).most_common(2)
# 先取奇数项与偶数项出现频率最高的数
a = a_most[0][0]
b = b_most[0][0]
# 若奇数项和偶数项出现频率最高的数值相等
if a==b:
if len(a_most)==1 and len(b_most)==1: # 类似[2,2]或[1,1,1,1,1]的情况
return n//2
elif len(a_most)>1: # 防止出现下标超出数组长度情况
# 计算取奇数出现频率最高数值的次数与偶数出现频率次高数值的次数之和
count1 = a_most[1][1]+b_most[0][1]
if len(b_most)>1:
# 计算取偶数出现频率最高数值的次数与奇数出现频率次高数值的次数之和
count2 = a_most[0][1]+b_most[1][1]
# 比较二者大小
if count1 > count2:
count = count1
else:
count = count2
else: # 奇数和偶数出现频率最高数值不等
count = a_most[0][1] + b_most[0][1]
return n - count
注:
- enumerate(nums),返回值为下标,数值
- Counter(nums)计算各个数值出现的频率
- most_common(2)表示出现频率前两名
边栏推荐
- Office2021 安装MathType
- LeetCode - 105. 从前序与中序遍历序列构造二叉树;023.合并K个升序链表
- 7月29-31 | APACHECON ASIA 2022
- 【 LeetCode 】 1374. Generate each character string is an odd number
- Electron使用指南之初体验
- Linphone 被叫方如何解析来电SIP消息中的自定义头消息
- OpenCV开发中的内存管理问题
- es 官方诊断工具
- Translate My Wonderful | July Moli Translation Program Winners Announced
- Axure9的元件用法
猜你喜欢
7月29-31 | APACHECON ASIA 2022
Electron使用指南之初体验
J9 Digital Currency Theory: Identifying Web3's New Scarcity: Open Source Developers
日志框架学习
Caldera(一)配置完成的虚拟机镜像及admin身份简单使用
Electron User Guide Beginning Experience
ECCV 2022 | 通往数据高效的Transformer目标检测器
Leetcode刷题——字符串相加相关题目(415. 字符串相加、面试题 02.05. 链表求和、2. 两数相加)
Leetcode刷题——单调栈问题(739每日温度问题、496下一个更大元素I、503下一个更大元素 II)
扫码预约 | 观看Apache Linkis数据处理实践以及计算治理能力
随机推荐
LeetCode - 105. 从前序与中序遍历序列构造二叉树;023.合并K个升序链表
即时通讯开发移动端网络短连接的优化手段
Linphone 被叫方如何解析来电SIP消息中的自定义头消息
谷歌竞价机器学习如何去理解?
Axure9的元件用法
解析List接口中的常用的被实现子类重写的方法
网上那么多教人赚钱的方法,但是你实际上是靠什么赚钱的呢?
基于 outline 实现头像剪裁以及预览
二丙二醇甲醚醋酸酯
JWT学习
ALV报表学习总结
Leetcode刷题——单调栈问题(739每日温度问题、496下一个更大元素I、503下一个更大元素 II)
ShardingSphere-proxy +PostgreSQL实现读写分离(静态策略)
4 kmiles join YiSheng group, with more strong ability of digital business, accelerate China's cross-border electricity full domain full growth
分布式事务
MySQL安装配置教程(超级详细)
es 读流程源码解析
Fiddle设置接口数据用指定工具查看;Sublime Text设置json数据格式化转换
Electron使用指南之初体验
训练双塔检索模型,可以不用query-doc样本了?明星机构联合发文