[LeetCode 1775]通过最少操作数使数组的和相等

news2024/9/9 6:07:55

题目描述

题目链接:[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让其变成6可以让整个数组变大5,而挑选3最多变成6,只能让数组变大6-3=3

如图:要让数组2尽可能变大,所以第一次选择1变成6,差距缩减到25-15=10
第二次选择第二个1变成6,差距缩减到25-20=5
在这里插入图片描述

此时,第二个数组没有1了,最小是2,所以2的变化最多为4(因为6-2=4),还需要至少两步才能变到与数组1和相等,此时应该选择第一个数组中的6变成1,只需要一步就行
在这里插入图片描述

所以很明确了,我们要利用指针,指向小数组里面的最小值,和大数组里面的最大值,因为这样的数具有最大的变化能力!

代码(写得比较长,仅供参考)

class Solution {
public:
    int check(int q1[], int q2[], int s1, int s2) {
    	//默认s1 < s2,方便计算
        if(s1 > s2) return check(q2, q1, s2, s1);
        //p1指向小数组最小值,p2指向大数组最大值,cnt记录当前两个数组差值
        int p1 = 1, p2 = 6, res = 0, cnt = s2 - s1;
        while(cnt) {
        	//如果走到头了,即小数组所有数都变为6,大数组所有数都变成1,还不够,说明不可能
            if(p1 >= 6 || p2 <= 1) break;
            //如果cnt > 0, 且p1这个位置有数
            if(cnt && q1[p1]) {
            	//如果所有的p1都变成6,还是不足以将cnt填平
                if(cnt > q1[p1] * (6 - p1)) {
                    cnt -= q1[p1] * (6 - p1);
                    res += q1[p1];
                    q1[6] += q1[p1];
                } else {
                	//如果可以把cnt填平,那么只需要cnt / (6 - p1)上取整这么多次就可以
                    int t = (cnt + 5 - p1) / (6 - p1);
                    cnt = 0;
                    res += t;
                    q1[p1] -= t;
                }
            }
            p1++;
			//同理
            if(cnt && q2[p2]) {
                if(cnt > q2[p2] * (p2 - 1)) {
                    cnt -= q2[p2] * (p2 - 1);
                    res += q2[p2];
                    q2[p2] = 0;
                } else {
                    int t = (cnt + p2 - 2) / (p2 - 1);
                    cnt = 0;
                    res += t;
                    q2[p2] -= t;
                }
            }
            p2--;
        }

        if(cnt) return -1;
        else return res;
    }
    int minOperations(vector<int>& nums1, vector<int>& nums2) {
        int s1 = 0, s2 = 0, q1[7], q2[7];
        int n = nums1.size(), m = nums2.size();
        memset(q1, 0, sizeof q1);
        memset(q2, 0, sizeof q2);
        for (int i = 0; i < n; i++) {
            s1 += nums1[i];
            q1[nums1[i]]++;
        }
        for (int i = 0; i < m; i++) {
            s2 += nums2[i];
            q2[nums2[i]]++;
        }

        if(s1 == s2) return 0;
        else {
            return check(q1, q2, s1, s2);
        }
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler kubesphere kubekey 安装 ceph csi 及使用实例

按照官方文档,很轻松就可以进行安装, 安装过程中遇到一些疑问, 在安装后也得到清晰的理解 1. /root/ceph-csi-rbd.yaml 这里面的clusterId 按理说应该是ceph的clusterId, 不过官方文档并没有首重强调修改,暂时保持默认 下面6789端口就是我们在物理机上安装的ceph mon的主机i…

PCB设计指南:安规、布局布线、EMC、热设计、工艺

文章目录Part 1 安规距离要求部分一、爬电距离和电气间隙距离要求&#xff1a;Part 2 抗干扰、EMC部分一、长线路抗干扰二、小信号走线尽量远离大电流走线&#xff0c;忌平行&#xff0c;D>2.0mm。三、小信号线处理&#xff1a;电路板布线尽量集中&#xff0c;减少布板面积提…

广州蓝景分享—实用的CSS技巧,助你成为更好的开发者

Hello~~各位小伙伴&#xff0c;相信在前端开发项目中&#xff0c;CSS实现如修改输入占位符样式&#xff0c;多行文本溢出&#xff0c;隐藏滚动条&#xff0c;修改光标颜色&#xff0c;水平和垂直居中等等&#xff0c;这些都是我们非常熟悉的开发场景&#xff01;前端开发者几乎…

HashMap部分源码解析

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 前言 常量字段 构造方法 put方法 确定初始容量 为何我们的数组的大小要是2的n次幂 hash为何要异或其高位 扩容机制 前言 我们在前…

极客时间Kafka - 04 Kafka生产者和消费者拦截器

文章目录1. 什么是拦截器&#xff1f;2. Kafka 拦截器3. 典型使用场景4. 案例分享1. 什么是拦截器&#xff1f; 如果你用过 Spring Interceptor 或是 Apache Flume&#xff0c;那么应该不会对拦截器这个概念感到陌生&#xff0c;其基本思想就是允许应用程序在不修改逻辑的情况…

无人机边缘计算中的计算卸载——Stackelberg博弈方法论文复现附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

不会还有人不会热修复吧?

Class流派原理 基本原理:加载类的时候是找element&#xff0c;每个element对于一个dex。我要把我修复的那个类单独放到dex插入dexlist前面&#xff0c;在你做类加载从前往后找优先从你的dex加载加载的就是你修复后的class.这就是 实现代码 通过context拿到pathClassLoader&am…

Qt跨平台截图工具

Qt跨平台截图工具 文章目录Qt跨平台截图工具1、概述2、实现效果3、软件构成4、关键代码5、源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt自定义模块、工具&#x1f448; 1、概述 Qt版本&#xff1a;V5.12.5兼容系统&#xff1a; Windows&…

2022,记录与华为的这场会议

一、数据治理团体标准发布会 11月26日&#xff0c;中国计算机用户协会信息科技审计分会联合华为与擎创科技共同举办了“金融行业运维数据治理团体标准应用研讨暨2022年度调研报告线上发布会”。来自国家开发银行、中国建设银行、中国邮政储蓄银行、招商银行、兴业银行、中信银行…

【LeetCode_字符串_逻辑分析】9. 回文数

目录考察点第一次&#xff1a;2022年12月7日10:16:33解题思路代码展示题目描述给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左…

340页11万字智慧政务大数据资源平台大数据底座数据治理建设方案

目 录 第一章 项目概况 1.1 项目名称 1.2 项目单位 1.3 项目建设依据 1.4 项目建设内容和目标 1.4.1 建设内容 1.4.2 建设目标 1.5 项目投资估算及建设周期 1.5.1 项目投资估算 1.5.2 服务周期 第二章 现状 2.1 项目单位概况 2.1.1 单位职责、内设及下属机构、人员…

【配准图像】

MU-Net: A MULTISCALE UNSUPERVISED NETWORK FOR REMOTE SENSING IMAGE REGISTRATION &#xff08;MU-Net&#xff1a;一种多尺度无监督遥感图像配准网络&#xff09; 多传感器或多模态图像对的配准是许多遥感应用的基础性任务。为了实现高精度、低成本的遥感图像配准&#x…

彻底搞懂JS原型与原型链

说到JavaScript的原型和原型链&#xff0c;相关文章已有不少&#xff0c;但是大都晦涩难懂。本文将换一个角度出发&#xff0c;先理解原型和原型链是什么&#xff0c;有什么作用&#xff0c;再去分析那些令人头疼的关系。 一、引用类型皆为对象 原型和原型链都是来源于对象而…

浅谈Linux内核编程规范与代码风格

1 缩进 Tab的宽度是八个字符&#xff0c;因此缩进的宽度也是八个字符。有些异教徒想让缩进变成四个字符&#xff0c;甚至是两个字符的宽度&#xff0c;这些人和那些把 PI 定义为 3 的人是一个路子的。 注意&#xff1a;缩进的全部意义在于清晰地定义语句块的开始与结束&#…

《MongoDB》Mongo Shell中的基本操作-删除操作一览

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 来个关注吧&#xff0c;点个赞…

分布式事务,单JVM进程与多数据库,分布式事务技术选型,0-1过程,代码全。

由于很多小白程序员在单一JVM进程配合多数据库的架构环境中,总是考虑一主多从的mysql集群环境。还不知道mysql集群数据库按照表纵向分割以后,也是可以走数据库使用事务的。那么这里使用到的就是分布式事务,XA协议。现在大部分主流的数据库都支持XA协议。这里不用太多废话,直…

【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)

觉得有帮助请点赞关注收藏~~~ 一、JavaScript基础 Javascript是网页编程语言&#xff0c;决定网页元素的动作。HTML页面中通过<script></script>指定Javascript内容&#xff0c;通过//或者 /* */执行代码的备注功能&#xff0c;并且区分大小写。 1&#xff1a;变…

《视觉SLAM十四讲》示例程序编译报错处理(上)

高翔博士《视觉SLAM十四讲》这本书中的代码很不错&#xff0c;适合初学者。可惜有一些可能因为版本的问题会报错&#xff0c;本文总结一下我遇到的问题。 在slambook2/3rdparty文件夹git submodule update&#xff0c;这个版本是和书中的版本一致的。但我已经重新安装了新版Ei…

Webpack中的高级特性

自从webpack4以后&#xff0c;官方帮我们集成了很多特性&#xff0c;比如在生产模式下代码压缩自动开启等&#xff0c;这篇文章我们一起来探讨一下webpack给我们提供的高级特性助力开发。 探索webpack的高级特性 特性&#xff1a;treeShaking 顾名思义treeShaking&#xff0…

C++ Reference: Standard C++ Library reference: Containers: deque: deque: swap

C官网参考里链接&#xff1a;https://cplusplus.com/reference/deque/deque/swap-free/ 函数模板 <deque> std::swap (deque) template <class T, class Alloc> void swap (deque<T,Alloc>& x, deque<T,Alloc>& y); 交换两个双端队列容器的…