图解LeetCode——1775. 通过最少操作次数使数组的和相等(难度:中等)

news2024/9/21 18:44:00

一、题目

给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。

每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6)。

请你返回使 nums1 中所有数的和与 nums2 中所有数的和相等的最少操作次数。如果无法使两个数组的和相等,请返回 -1

二、示例

2.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.2> 示例 2:

【输入】nums1 = [1,1,1,1,1,1,1], nums2 = [6]
【输出】-1
【解释】没有办法减少 nums1 的和或者增加 nums2 的和使二者相等。

2.3> 示例 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

三、解题思路

首先,根据题意,我们需要计算出数组nums1nums2之间,最小的操作次数,使得nums1的总和:sum(nums1)与nums2的总和:sum(nums2)两个值相等。那么我们可以根据如下4个步骤来解决这个问题:

步骤1】分别计算sum(nums1)sum(nums2)的值,确定两个数组加和的差值diff,以及sum(nums1)sum(nums2)之间的大小关系

 【步骤2】将总和较小的数组赋值为int[] smaller,将总和较大的数组赋值为int[] bigger

对于smaller数组中的每个值,我们要执行变大操作,其中:由于最大值是6,所以每个元素s变大的最大跨度是:6 - s
对于bigger数组中的每个值,我们要执行变小操作,其中:由于最小值是1,所以每个元素b变大的最大跨度是:b - 1

 【步骤3】创建一个用于存储跨度&出现次数的数组int[] range(也可以采用Map结构),其中:下标index表示跨度值range[index]表示该跨度值出现的次数。由于题目中指出,nums1和nums2中元素的值的范围是[1, 6],所以,对应的跨度值就是[0, 5]。为了便于画图,图中采用Map结构表示:

 【步骤4】由于要求计算出最小操作次数,所以我们需要从range数组末尾开始遍历执行对比操作,以上面图中的例子做演示,diff=11range=[1,1,1,1,5,3]

第1次操作】因为差值diff > 跨度5,所以差值diff变为6(11减5),range[5]的出现次数变为2(3减1);
第2次操作】因为差值diff > 跨度5,所以差值diff变为1(6减5),range[5]的出现次数变为1(2减1);
第3次操作】因为差值diff <= 跨度5,满足题解,返回最少操作次数为:3

四、代码实现

class Solution {
    public int minOperations(int[] nums1, int[] nums2) {
        int result = 0, l1 = nums1.length, l2 = nums2.length, sum1 = 0, sum2 = 0, diff;
        if (6 * l1 < l2 || 6 * l2 < l1) return -1; // 无法使两个数组的和相等,返回-1
        for (int n1 : nums1) sum1 += n1;
        for (int n2 : nums2) sum2 += n2;
        if ((diff = Math.abs(sum1 - sum2)) == 0) return 0; // 如果两个数组和相等,则不需要操作,返回0
        int[] range = calculate(nums1, nums2, sum1, sum2);
        for (int i = 5; i >= 0; i--) { // 从最大的差值开始对比
            while (range[i] > 0) { // 如果差值range[i]出现的次数不为0
                result++; // 操作次数加1
                if (i >= diff) return result; // 如果差值大于等于diff,则操作结束,返回操作数result
                range[i]--; // 差值range[i]的出现次数减1
                diff -= i; // 更新diff值
            }
        }
        return -1;
    }
    // 计算每个差值(1~5)出现的次数
    private int[] calculate(int[] nums1, int[] nums2, int sum1, int sum2) {
        int[] bigger = (sum1 < sum2) ? nums2 : nums1;
        int[] smaller = (sum1 < sum2) ? nums1 : nums2;
        int[] range = new int[6]; // index:差值  range[index]:该差值出现的次数
        for (int s : smaller) ++range[6 - s]; // 对于总数较小的数组,要执行增加操作,由于理论上最大值是6,所以最大可以增加"6-s"个数值
        for (int b : bigger) ++range[b - 1]; // 对于总数较大的数组,要执行减法操作,由于理论上最小值是1,所以最大可以减少"b-1"个数值
        return range;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

【vim】Darcula 配色设置

因为本人一直习惯了用 Jetbrains 家的产品&#xff0c;而且一直独钟 Dracula 配色&#xff0c;因此想要在 Git Bash 中为 vim 配一款 Dracula 配色。本博客将详细介绍如何为 vim 配置暗系主题 Dracula。 一、安装 Dracula 在 Dracula 的官网其实已经给出了关于如何在 vim 中配…

夯实算法-课程表

题目&#xff1a;LeetCode 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必…

Linux系统编程5——Socket编程(网络通信)

文章目录前言一、套接字二、基础知识三、网络套接字函数3.1、struct sockaddr3.2、socket函数3.3、bind函数3.4、listen函数3.5、accept函数3.6、connect函数3.7、读取/发送数据函数3.8 客户端服务器通信demo四、select函数1、TCP状态简介2、端口复用2.1、setsockopt函数3、半关…

云之道知识付费v1.5.4小程序+前端(含pc付费插件)

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 云之道知识付费v1.5.4小程序前端&#xff08;含pc付费插件&#xff09; 版本号&#xff1a;1.5.4 – 商用无限开 无需重新上传小程序 【修复】上一版本公众号版本打开白屏问题 版本号&a…

【C语言】函数三要素,变量作用域、生存周期、存储类型

目录 写在前面 一、函数的用法 1、声明 2、调用 3、定义 形参与实参类型不一致 形参与实参类型一致 函数值类型与返回值类型不一致 函数值类型与返回值类型一致 二、变量的作用域与生存周期 三、变量的储存类型&#xff08;auto,extern,static,register&#xff09;…

AI虚拟人千亿级市场来袭,景联文科技提供全方面数据采集标注服务

“AI虚拟人通过语音、文字、视觉的理解和生成&#xff0c;结合动作识别、环境感知等多种方式可与人进行互动。AI虚拟人中运用到的强大算法需要高质量标注数据不断对其进行优化训练&#xff0c;景联文科技提供全方面数据采集标注服务。” 11月18日&#xff0c;科大讯飞在第五届世…

行为型模式 - 访问者模式Visitor

学习而来&#xff0c;代码是自己敲的。也有些自己的理解在里边&#xff0c;有问题希望大家指出。 行为型模式&#xff0c;我之所以把他放到第一个&#xff0c;是因为它号称是GoF中最难的一个。 模式的定义与特点 在访问者模式中&#xff08;Visitor Pattern&#xff09;中&…

pandasGUI:一款开源的功能异常强大的数据可视化分析工具

在很早之前关于可视化的描述中&#xff0c;我们介绍过一款D-table的数据分析操作工具。和D-table的操作相似&#xff0c;还有一款pandasGUI的开源工具更加强势。 Pandasgui是一个开源的python模块&#xff0c;它为pandas创建了一个GUI界面&#xff0c;我们可以在其中使用panda…

Impact of Problem Decomposition on Cooperative Coevolution

0、论文背景 本文在CCVIL的基础上&#xff0c;讨论了问题的分解效果对于CC框架的影响。由于VIL本身是一项计算成本昂贵的任务&#xff0c;因此应该避免在VIL上花费过多的时间而对CCEA没有显著的好处。我们进行实证研究来解决三个密切相关的问题&#xff1a; 1)更好的问题分解会…

STC 51单片机58——旋转LED

STC11F LED部分&#xff1a; #include "STC11.h" #define u8 unsigned char #define u16 unsigned int //全亮 //u8 code Picture1[8]{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ; //u8 code Picture2[8]{0xe7,0xdb,0xbd,0x7e,0x7e,0xbd,0xdb,0xe7}; //u8 code P…

阿里云的工程师又闯祸了,github上紧急修复

最近不少用户使用阿里云提供的测试用例出现了被删除了用户目录下的所有文件&#xff0c;项目地址是&#xff1a;https://github.com/aliyun/aliyun-clialiyun-cli/cli/completion_installer_test.goLines 87 to 99 in 550ccb6path : filepath.Join(u.HomeDir, ".bashrc&qu…

求知 | 聊聊Android资源加载那些事 - Resource的初始化

Hi,你好 &#x1f603; 引言 在上一篇&#xff0c;求知 | 聊聊Android资源加载的那些事 - 小试牛刀 中&#xff0c;我们通过探讨 Resource.getx() ,从而解释了相关方法的背后实现, 明白了那些我们日常调用方法的背后实现。 那么&#xff0c;不知道你有没有好奇 context.reso…

【蓝桥杯国赛真题07】python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

目录 python杨辉三角 一、题目要求 1、提示信息 2、编程实现 3、输入输出

蓝桥杯嵌入式Debug

文章目录前言一、Debug是什么二、如何调试1.重要调试按键介绍2.其他按键介绍三、监视变量窗口总结前言 这一篇文章是非常重要的&#xff0c;掌握了这篇文章有助于大家在比赛中快速找到错误。 一、Debug是什么 Debug是一种程序&#xff0c;一种调试工具&#xff0c;说白了就是…

Elasticsearch:如何在 Elastic Agents 中配置 Beats 来采集定制日志

在我之前的文章 “Observability&#xff1a;使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0”&#xff0c;我详细地描述了如何安装 Elasticsearch&#xff0c;Stack 及 Elastic Agents 来采集系统日志及指标。很多开发者可能会有疑问&#xff0c;在我们的实际使用中…

陈都灵《我们当打之年》热播《关索岭》上热搜,温州人爱望京卡牌

最近&#xff0c;电视连续剧《我们的当打之年》&#xff0c;正在各大卫视台热播&#xff0c;一起热起来的还有该剧主演陈都灵。说起主演陈都灵&#xff0c;她虽然不是正宗的电影学院科班出身&#xff0c;但是她的演技却透露着灵气&#xff0c;也给人以真实的感觉。 陈都灵无疑是…

[附源码]Python计算机毕业设计Django学习帮扶网站设计与实现

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2023年哪些渲染器更好用?3D新手适合的渲染器汇总

现在很多人都使用3D软件来创作自己的作品&#xff0c;所以渲染器的使用必不可少。有许多流行的渲染器&#xff0c;包括 V-Ray、Octane、Arnold、Corona、RedShift。对于许多 3D 新手来说&#xff0c;哪种渲染器最好&#xff1f; 这些渲染器的原理基本相同&#xff0c;只是操作…

大学免费查题接口系统

大学免费查题接口系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点…

地图信息,障碍判断以及寻路算法(A星算法,B星算法和蚁群算法等)

一、广度优先遍历和深度优先遍历 在学习寻路算法之前,我们先来了解一下广度优先遍历和深度优先遍历. 什么是广度优先遍历? 广度优先遍历(breadth first search)是一个万能的算法. 广度优先是从初始状态一层一层向下找&#xff0c;直到找到目标为止。 广度优先遍历&#x…