LeetCode中等题之通过最少操作次数使数组的和相等

news2024/11/19 3:22:18

题目

给你两个长度可能不等的整数数组 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 <= 10^5
1 <= nums1[i], nums2[i] <= 6

来源:力扣(LeetCode)

解题思路

  这个题和归并排序中将两个归并段归并有些许类似。首先需要定义操作,所要用到的操作无非就是两种,第一种就是将当前的数字减到1,第二种就是将当前的数字加到6,如果nums1的和大于nums2的和,那么对于nums1里的元素一定是做减法的,对于nums2中的元素一定是做加法,怎么操作收益最大?这是很显然的,如果一个数字尽可能的大然后是需要做减法的,那么它的收益是最大的,如果一个数字尽可能的小然后需要做加法,那么它的收益是最大的,所以我们需要先对nums1和nums2进行排序,一个按降序来排,一个按升序排,排完之后定义两个指针,分别指向两个数组的头部并按条件进行遍历,到了这里就开始有些像归并段的合并了,分别判断i指向的元素和j指向的元素哪个收益最大,即判断,i指向的元素减去1和6减去j指向的元素哪个大,哪种操作收益大就选择哪种操作,并且进行差距的填平,如果遍历完两个数组都没能将两者的差距填平,那么返回-1。

class Solution:
    def minOperations(self, nums1: List[int], nums2: List[int]) -> int:
        a,b=sum(nums1),sum(nums2)
        if a==b:
            return 0
        diff=a-b  #两者差距
        def func(nums1,nums2,diff):
            nums1.sort(reverse=True)
            nums2.sort()
            ans,m,n=0,len(nums1),len(nums2)
            i=j=0
            while i<m and j<n:
                if nums1[i]-1>6-nums2[j]:
                    diff-=nums1[i]-1  #填平差距
                    i+=1
                else:
                    diff-=6-nums2[j]  #填平差距
                    j+=1
                ans+=1   #记录操作次数
                if diff<=0:  #差距已被填平
                    return ans
            if i!=m:  #如果两个数组一长一短,进行后续的填平
                for k in range(i,m):
                    diff-=nums1[k]-1
                    ans+=1
                    if diff<=0:
                        return ans
            else:
                for k in range(j,n):
                    diff-=6-nums2[k]
                    ans+=1
                    if diff<=0:
                        return ans
            return -1
        return func(nums1,nums2,diff) if a>b else func(nums2,nums1,-diff)

在这里插入图片描述

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

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

相关文章

计算机组成大题分析(三)

假定计算机 M 字长为 16 位&#xff0c;按字节编址&#xff0c;连接 CPU 和主存的系统总线中地址线为 20 位、数据线为 8位&#xff0c;采用 16 位定长指今字&#xff0c;指令格式及其说明如下: 其中&#xff0c;op1-op3 为操作码&#xff0c;rs&#xff0c;t 和 rd 为通用寄存…

【计算机视觉+CNN】keras+ResNet残差网络实现图像识别分类实战(附源码和数据集 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、深度卷积神经网络模型结构 1&#xff1a;LeNet-5 LeNet-5卷积神经网络首先将输入图像进行了两次卷积与池化操作&#xff0c;然后是两次全连接层操作&#xff0c;最后使用Softmax分类器作为多分类输出&#xff0c;它对…

MySQL插入汉字报错的解决方案

MySQL插入汉字报错的原因是字符集的问题&#xff0c;MySQL默认使用的是Latin&#xff08;拉丁文&#xff09;字符集&#xff0c;可以在创建数据库时指定其字符集&#xff1a;CREATE DATABASE test DEFAULT CHARACTER SET utf8 或者修改MySQL的配置文件&#xff0c;可以参考以下…

Qt事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

前言&#xff1a; 之前写过有关事件循环和条件变量的博客&#xff1a; Qt使用事件循环&#xff0c;信号&#xff0c;stop变量&#xff0c;sleep阻塞&#xff0c;QWaitConditionQMutex条件变量&#xff0c;退出子线程工作_大橘的博客-CSDN博客_qt stop函数 Qt事件循环&#x…

Unity3D导出Android工程中使用并交互

, 目录 1&#xff0c;版本信息 2&#xff0c;前期准备 Unity方面&#xff1a; Android方面&#xff1a; 3&#xff0c;Android与Unity3D交互 1&#xff0c;版本信息 unity2020 android studio 2021 *不要用android studio 2020系列&#xff0c;存在不能导入Library的b…

Spring学习 | Bean作用域生命周期

文章目录一、作用域1.1 xml文件中配置1.2 注解配置二、生命周期2.1 四个阶段2.2 添加后置处理器2.3 实现aware类型接口2.4 Bean 初始化的方式2.5 Bean 销毁的方式2.6 测试程序学习视频&#x1f3a5;&#xff1a;https://www.bilibili.com/video/BV1Vf4y127N5 一、作用域 ❓ 引入…

Linux系统中裸机按键中断的驱动方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何实现按键中断的驱动​方法。 目录 ​第一&#xff1a;外部中断头文件实现 ​第二&#xff1a;外部中断源文件的具体实现 ​第三&#xff1a;编写对应的main.c函数 ​第一&#xff1a;外部中断头文件实现 #ifndef _…

基于keras平台CNN神经网络模型的服装识别分析

在许多介绍图像识别任务的介绍中&#xff0c;通常使用着名的MNIST数据集。 最近我们被客户要求撰写关于图像识别的研究报告&#xff0c;包括一些图形和统计输出。但是&#xff0c;这些数据存在一些问题&#xff1a; 1.太简单了。例如&#xff0c;一个简单的MLP模型可以达到99…

Java搭建宝塔部署实战毕设项目springboot客户管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目&#xff0c;springboot客户管理系统源码&#xff0c;感兴趣的朋友可以自行下载搭建测试。 技术架构 技术框架&#xff1a;SpringBoot MySQL5.7 mybatis shiro Lay…

DDR4时序标准规范(一)

DDR4时序标准规范引脚描述DDR4 SDRAM寻址DDR4架构的模块描述功能描述简化状态机基本功能复位和初始化程序上电和初始化顺序电压稳定后的复位初始化顺序无控制的下电顺序引脚描述 标志类型功能CK_t, CK_c输入Clock: CK_t和CK_c是差分时钟输入。所有的地址和控制输入信号在CK_t的…

主成分分析(PCA)原理及R语言实现及分析实例

主成分分析&#xff08;PCA&#xff09;是一种数据降维技巧&#xff0c;它能将大量相关变量转化为一组很少的不相关变量&#xff0c;这些无关变量称为主成分。最近我们被客户要求撰写关于主成分分析&#xff08;PCA&#xff09;的研究报告&#xff0c;包括一些图形和统计输出。…

Vagrant搭建Centos

1.下载安装vagrant 01访问Vagrant官网 ​ https://www.vagrantup.com/ 02 点击Download ​ Windows&#xff0c;MacOS&#xff0c;Linux等 03 选择对应的版本 04 傻瓜式安装 05 命令行输入vagrant&#xff0c;测试是否安装成功,显示如下&#xff1a; 2.下载安装virtua…

半解析快速傅里叶变换

我们提出了一种处理傅里叶变换的方法&#xff0c;其并不需要二次多项式相位项的抽样&#xff0c;而是用解析的方法处理。我们提出该理论的同时也给出了几个例子证明其潜力。 1.简介 物理光学建模需要频繁地从空间转换到角频域&#xff0c;反之亦然。这可以由电场和磁场分…

网络编程(用于不同电脑之间的信息交互):UDP、TCP

网络编程&#xff1a; 在网络通信写一下&#xff0c;不同计算机运行的程序&#xff0c;可以进行数据传输 IP地址&#xff1a;设备&#xff08;手机、电脑等&#xff09;在网络中的地址&#xff0c;是唯一的标识 端口&#xff1a;应用程序在设备中唯一的表示 协议&#xff1a…

数据结构学习——表、查找

定义 设记录表L(R1 R2…其中Ri(L<i<n)为记录&#xff0c; 对给定的某个值k&#xff0c; 在表L中确定key k的记录的过程&#xff0c;称为查找。若表Lz中存在记录Ri de key k,记为Ri.key,则查找成功&#xff0c;返回该记录在表L中的序号i&#xff08;或Ri的地址&#xff…

优秀的 Verilog/FPGA开源项目介绍(二十)- 张量处理单元(TPU)

介绍张量处理单元( Tensor Processing Unit, TPU ) 是谷歌专门为神经网络机器学习开发的人工智能加速器 专用集成电路(ASIC) &#xff0c;特别是使用谷歌自己的TensorFlow软件。谷歌于 2015 年开始在内部使用 TPU&#xff0c;并于 2018 年将它们作为其云基础设施的一部分并通过…

Zabbix6.0使用教程 (三)—zabbix6.0的安装要求

接上篇&#xff0c;我们继续为大家详细介绍zabbix6.0的使用教程之zabbix6.0的安装部署。接下来我们将从zabbix部署要求到四种不同的安装方式逐一详细的为大家介绍。本篇讲的是部署zabbix6.0的要求。 zabbix6.0安装要求 硬件&#xff1a;内存和磁盘 Zabbix6.0安装 运行需要物…

算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)

目录 前言 DP问题它是什么&#xff08;了解&#xff09; 从中学的例题谈起 再来说一下&#xff0c;DP问题的核心思想&#xff08;理解&#xff09; DP问题的解决方法 先说方法论&#xff1a; 再说具体的例子 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; DP和…

kotlin之range范围表达式

Kotlin 中的 Range 有 CharRange、LongRange、IntRange range 范围 CharRange、LongRange、IntRange 范围区间 var a:IntRange 50..100for (i in a){ //遍历50~100的分数分别在什么位置print("成绩&#xff1a;$i")if(i in 1..59){ //1~59 范围println("…

Leica Infinity三维映射环境数据

Leica Infinity三维映射环境数据 Leica Infinity是软件工程师和该领域专家的名字&#xff0c;以及您的工作计划信息。该软件被设计和呈现为一个强大的产品&#xff0c;并且来自六边形组。Leica Infinity产品的居民试图用新的眼光创造新的数据处理。使用此软件&#xff0c;您可以…