LeetCode 1775. 通过最少操作次数使数组的和相等 --双指针

news2024/12/23 9:12:03
  1. 通过最少操作次数使数组的和相等
    中等
    174
    相关企业
    给你两个长度可能不等的整数数组 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 <= 105
1 <= nums1[i], nums2[i] <= 6

题解

这个题目比较巧妙的地方在于,因为可以任意修改元素到[1,6],所以只要两个数组不出现极端的情况,比如一个数组全部变成6的和都没有另外一个数组全部变成1的和大,那么都是可以处理成两个数组和一致的。

为了方便处理,我们把数组排序,并且保证第1个数组的和一定大于等于第2个,那么从贪心的角度来说,我们肯定希望第一个数组的尾部变小,或者第2个数组的头部变大,于是我们每次操作就判断下修改第一个数组还是第2个数组收益更大就好。

AC代码

class Solution {
public:
    int minOperations(vector<int>& nums1, vector<int>& nums2) 
    {
        if(nums1.size()>nums2.size()*6 || nums1.size()*6<nums2.size())return -1;
        int sum1 = 0, sum2 = 0;
        for(int i=0;i<nums1.size();i++)
        sum1 += nums1[i];
        for(int i=0;i<nums2.size();i++)
        sum2 += nums2[i];
        if(sum1 == sum2)return 0;
        //保证nums1一定大于num2,主要方便后面的计算处理
        if(sum1<sum2)
        {
            swap(nums1, nums2);
            swap(sum1, sum2);
        }
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        //因为nums1的和一定大于num2,所以目标转换成了让num1不断减小,让num2不断变大
        //从贪心的角度来看,排序后,num1从尾部向头部遍历减小会更好些
        //同理排序后,num2从头部向尾部遍历增大会更好些
        int t=nums1.size()-1, s=0;
        int total = 0;
        while(s<nums2.size()&&t>=0)
        {
            int x1 = nums1[t], x2=nums2[s];
            for(int num=nums1[t];num>=1;num--)
            {
                if(sum1 - nums1[t]+num >= sum2)
                {
                    x1 = num;
                }
                else break;
            }
            for(int num=nums2[s];num<=6;num++)
            {
                if(sum2-nums2[s]+num<=sum1)
                {
                    x2 = num;
                }
                else break;
            }
            //说明修改nums2收益更大
            if(sum1-(sum2-nums2[s]+x2)<=sum1-nums1[t]+x1-sum2)
            {
                sum2 = sum2 - nums2[s] + x2;
                s += 1;
            }
            else
            {
                //说明修改nums1收益更大
                sum1 = sum1 - nums1[t] + x1;
                t -= 1;
            }
            total += 1;
            if(sum1==sum2)return total;
        }
        while(s<nums2.size())
        {
            int x2 = nums2[s];
            for(int num=nums2[s];num<=6;num++)
            {
                if(sum2-nums2[s]+num<=sum1)
                {
                    x2 = num;
                }
                else break;
            }
            sum2 = sum2 - nums2[s] + x2;
            s += 1;
            total += 1;
            if(sum1==sum2)return total;
        }
        while(t>=0)
        {
            int x1 = nums1[t];
            for(int num=nums1[t];num>=1;num--)
            {
                if(sum1 - nums1[t]+num >= sum2)
                {
                    x1 = num;
                }
                else break;
            }
            sum1 = sum1 - nums1[t] + x1;
            t -= 1;
            total += 1;
            if(sum1==sum2)return total;
        }
        return -1;
    }
};

在这里插入图片描述

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

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

相关文章

Android9.0以上系统安装Edxposed

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、背景说明 Android9.0以前&#xff0c;Xposed框架可通过apk进行快速安装&#xff0c;github地址&#xff1a; GitHub - rovo89/Xpos…

CRACK:CAD Exchanger SDK 3.15.0/MAC/WIN/LINUX/Android

CAD Exchanger SDK用于读取、写入和可视化 3D CAD 文件的软件库 通过访问 CAD 和 BIM 数据&#xff0c;快速轻松地丰富您的 Web、服务器或桌面应用程序。Ω578867473 使用 CATIA、SOLIDWORKS、Creo、STEP、JT、IFC 以及来自 C、Python、C#、Java 和 JavaScript 的更多格式。 适…

人民日报强烈推荐的13本证书,含金量都很高!

人民日报每年都会推荐一些当代最具含金量的证书&#xff0c;并建议大学生在大学期间的时候着手准备&#xff0c;为毕业后的简历添加色彩。 本次&#xff0c;人民日报推荐的证书主要有下列13种&#xff1a; 01 CPA&#xff08;注册会计师&#xff09; 含金量&#xff1a;★★…

博客管理系统

大致思路 1. 引入的依赖 数据库 Maven Repository: mysql mysql-connector-java 5.1.47 (mvnrepository.com) <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mys…

centos7用容器搭建svn仓库和管理页面

文章目录安装docker拉取 svn 仓库管理镜像创建仓库使用仓库安装docker 安装 docker 服务 yum install -y docker 修改 docker 服务配置&#xff0c;添加镜像拉取加速路径 vim /etc/docker/daemon.json javascript {"registry-mirrors": ["http://f1361db2.m.da…

【网页期末作业】基于HTML学校教育网页项目的设计与实现

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

更自动化的开发----给开发插上恣意飞翔的翅膀!

总结&#xff1a; 设置启动项&#xff1a;开机时候快速启动自己所需要的程序&#xff0c;根据程序数量不一样&#xff0c;每天节省可重复的劳动时间约为5s-1min(此处数据为自己瞎说 O(∩_∩)O哈哈~)&#xff1b; 使用生成代码的插件&#xff1a;开发使用easycode的插件&#…

m基于多D2D通信对和多蜂窝用户的LTE预编码技术matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 LTE网络中采用MIMO技术增加系统容量&#xff0c;提升吞吐率&#xff0c;从理论上来看,多天线的空分复用能成倍增加系统容量。但实际上并非如此,如&#xff0c;22MIMO的容量C&#xff08;容量&…

深度学习实验3 - 卷积神经网络

文章目录实验要求数据集定义1 手写二维卷积1.1 自定义卷积通道1.2 自定义卷积层1.3 添加卷积层导模块中1.4 定义超参数1.5 初始化模型、损失函数、优化器1.6 定义模型训练和测试函数&#xff0c;输出训练集和测试集的损失和精确度1.7 训练1.8 loss及acc可视化2 torch.nn 实现二…

一文打通ER图(手把手教你画)

期末了&#xff0c;E-R图也是大学课程设计中经常用到的&#xff0c;也是期末考的重点&#xff0c;毕竟大学生也没什么好考的&#xff0c;最近也有不少同学问&#xff0c;不少单子也扯到E-R图&#xff0c;但是我看了看网上的玩意好像没到手把手的地步&#xff0c;那么我就写一个…

Java面试题总结-ArrayList和LinkedList的区别

ArrayList和LinkedList都实现了List接口&#xff0c;并且两者都不是线程安全的。他们有以下的区别&#xff1a; &#xff08;1&#xff09;首先&#xff0c;最最本质的区别是&#xff1a;ArrayList内部使用的是动态数组来存储元素&#xff0c;而LinkedList内部使用的是双向链表…

PS图层+移动工具(3)对齐方式 对齐参照调整

此文为续文 请先查看 PS图层移动工具(2)复制删除快捷键 图层分组 前景色填充 后再查看本文 我们先来多选几个图层 然后上方属性栏 就激活了对应的操作 我们先来一波 左对齐 然后 就左对齐了 值得一提的是 这个左对齐 不是在屏幕的最左侧对齐 而是针对 所有你当前选择的图片…

华为机试 - 查找二叉树节点

题目描述 已知树形结构的所有节点信息,现要求根据输入坐标(x,y)找到该节点保存的内容值,其中x表示节点所在的层数,根节点位于第0层,根节点的子节点位于第1层,依次类推;y表示节点在该层内的相对偏移,从左至右,第一个节点偏移0,第二个节点偏移1,依次类推; 举例:上…

mysql索引失效

一、索引失效 1.当or左右查询字段只有一个是索引&#xff0c;该索引失效&#xff0c;只有当or左右查询字段均为索引时&#xff0c;才会生效 2.使用order by对数据库进行查询时&#xff0c;导致索引失效 &#xff0c;order by走全表扫描比回表的时间更少 3.主键和唯一索引在同…

算法刷题入门数据结构|二分查找

一.二分查找基础 1、二分查找介绍 二分查找(Binary search)也称折半查找&#xff0c;是一种效率较高的查找方法&#xff0c;时间复杂度。当对查数题目有时间复杂度要求是&#xff0c;首先就要考虑到二分查找。二分查找的思想很简单&#xff0c;属于分治策略的变种情况。但是&am…

贷后催收评分模型中的数据清洗与数据治理细节介绍

数据清洗是一个非常修炼身心的过程&#xff0c;途中你除了需要把所有的数据整业务合到一张宽表里。而这种宽表中所有的字段&#xff0c;是你理解完业务后&#xff0c;细心整理出来的所有适合建模的数据。 今天我们给大家介绍一下&#xff0c;在风控贷后评分模型中&#xff0c;…

C规范编辑笔记(七)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) 正文&#xff1a; 大家好&#xff0c;今天来分享一下C语言规范编辑笔记的第七篇&#xff0c;分享这个是希望自己后面忘记了可以去复习…

ADI Blackfin DSP处理器-BF533的开发详解26:扩展IO输入的详细讲解(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 ADSP-EDU-BF53x 开发板上扩展接口的 PORT2 和 PORT3 中引出了 6 个扩展 IO 接口输入接口&#xff0c;这些连接到了CPLD…

C. Rooks Defenders Codeforces Round #791 (Div. 2)(树状数组!)

传送门 题意&#xff1a;给你一个的棋盘&#xff0c;然后给你一个t&#xff08;t只能为1&#xff0c;2&#xff0c;3&#xff09;&#xff0c;对于不同的t产生不同的影响&#xff1a; t1时&#xff0c;给你一个点的坐标x,y&#xff0c;在这个点上生成一辆坦克&#xff08;保证…

模拟实战从外网打点渗透到内网域控的笔记

信息收集 本次项目是一个是模拟渗透测试 电信诈骗网站&#xff0c;境外人员依赖该网站通过优惠卷诱导受害者进行消费&#xff0c; 诈骗受害人金钱。 前台地址 项目拓扑图 http://ip/user.php?moddo&actlogin&fromtohttp%3A%2F%2F43.143.193.216%2F 后台地址 http…