Leetcode.1775)通过最少操作次数使数组的和相等
题目链接
题干
给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。
每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6)。
请你返回使 nums1 中所有数的和与 nums2 中所有数的和相等的最少操作次数。如果无法使两个数组的和相等,请返回 -1 。
示例 1:
输入:nums1 = [1,2,3,4,5,6], nums2 = [1,1,2,2,2,2]
输出:3
解释:你可以通过 3 次操作使
nums1 中所有数的和与 nums2 中所有数的和相等。以下数组下标都从 0 开始。
- 将 nums2[0] 变为 6 。 nums1 = [1,2,3,4,5,6], nums2 = [6,1,2,2,2,2] 。
- 将 nums1[5] 变为 1 。 nums1 = [1,2,3,4,5,1], nums2 = [6,1,2,2,2,2] 。
- 将 nums1[2] 变为 2 。 nums1 = [1,2,2,4,5,1], nums2 = [6,1,2,2,2,2] 。
示例 2:
输入:nums1 = [1,1,1,1,1,1,1], nums2 = [6]
输出:-1
解释:没有办法减少 nums1 的和或者增加nums2 的和使二者相等。
示例 3:
输入:nums1 = [6,6], nums2 = [1]
输出:3
解释:你可以通过 3 次操作使 nums1 中所有数的和与 nums2中所有数的和相等。以下数组下标都从 0 开始。
- 将 nums1[0] 变为 2 。 nums1 = [2,6], nums2 = [1] 。
- 将 nums1[1] 变为 2 。 nums1 = [2,2], nums2 = [1] 。
- 将 nums2[0] 变为 4 。 nums1 = [2,2], nums2 = [4] 。
提示:
1 <= nums1.length, nums2.length <= 1 0 5 10^5 105
1 <= nums1[i], nums2[i] <= 6
分析:
代码:
class Solution {
public:
int minOperations(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size(),m = nums2.size();
//特判 如果此时nums1和的最小值 都大于 nums2和的最大值 那么显然不能得出答案 反之也是一样
if(n > 6*m || 6*n < m) return -1;
int diff = accumulate(nums2.begin(),nums2.end(),0) - accumulate(nums1.begin(),nums1.end(),0);
//保证 nums1是小的数组 nums2 是大的数组
if(diff < 0){
diff *= -1;
swap(nums1,nums2);
}
//记录变化量
int cnt[6] = {0};
for(auto &x:nums1) cnt[6 - x]++;
for(auto &x:nums2) cnt[x - 1]++;
int ans = 0;
//变化量从大到小枚举
for(int i = 5;i >= 0;i--){
//如果此时的变化量已经 超过 差值diff了 那么加上对其上取整的结果 退出循环
if(i * cnt[i] >= diff){
ans += (diff + i - 1)/i;
break;
}
ans += cnt[i];
diff -= cnt[i] * i;
}
return ans;
}
};
时间复杂度:O(N)
相关文章
- java打印数组元素_java Arrays快速打印数组的数据元素列表案例
- 数组和集合的相互转换「建议收藏」
- 七、数组及其操作《2022 solidity8.+ 版本教程到实战》
- 树状数组的区间修改与查询
- 【C 语言】字符串操作 ( 使用 数组下标 操作字符串 | 使用 char * 指针 操作字符串 )
- 【C 语言】一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )
- 【C 语言】数组 ( 多维数组操作模型 | 取某个数组元素地址 | 取某个数组元素值 )
- 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )
- gis经纬度坐标转换多格式兼容:支持字符串/数组/GeoJSON
- 对多个有序数组,实现归并操作详解编程语言
- JS判断是否是数组:使用isArray()方法
- jQuery $.merge()方法合并数组
- Linux下数组操作技巧完全指南(linux数组操作)
- MySQL简易使用数组参数进行操作(mysql数组参数)
- Java 中初始化数组
- Linux中如何操作变长数组(linux变长数组)
- MySQL的一维数组操作简介(mysql一维数组使用)
- PHP数组实例说明
- javascript定义初始化数组函数
- javascript数组操作实用技巧
- PHP操作数组相关函数
- php中用foreach来操作数组的代码
- perl常量、多维数组及变量的初始化的实例代码
- js数组的基本用法及数组根据下标(数值或字符)移除元素
- Jquery数组操作大全个人总结
- js数组操作之pop,push,unshift,splice,shift
- php数组操作之键名比较与差集、交集赋值的方法
- javascript数组操作详解