刷爆力扣之公平的糖果交换

news2024/11/23 22:12:16

刷爆力扣之公平的糖果交换

HELLO,各位看官大大好,我是阿呆 🙈🙈🙈
今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rn9xBEN1-1669711650779)(刷爆力扣之公平的糖果交换.assets/src=http___b-ssl.duitang.com_uploads_item_201701_01_20170101020808_eU8nF.thumb.400_0.gif&refer=http___b-ssl.duitang.gif)]

该专栏按照不同类别标签进行刷题,每个标签又分为 Easy、Medium、Hard 三个等级 👊👊👊

本部分所有题目均来自于LeetCode 网,并于每道题目下标明具体力扣网原题链接 🏃🏃🏃

OK,兄弟们,废话不多直接上题,冲冲冲 🌞🌞🌞


一 🏠 题目描述

888. 公平的糖果交换

爱丽丝和鲍勃拥有不同总数量的糖果。给你两个数组 aliceSizesbobSizesaliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量

两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果。一个人拥有的糖果总数量是他们每盒糖果数量的总和

返回一个整数数组 answer,其中 answer[0] 是爱丽丝必须交换的糖果盒中的糖果的数目,answer[1] 是鲍勃必须交换的糖果盒中的糖果的数目。如果存在多个答案,你可以返回其中 任何一个 。题目测试用例保证存在与输入对应的答案

示例 1:

输入:aliceSizes = [1,1], bobSizes = [2,2]
输出:[1,2]

示例 2:

输入:aliceSizes = [1,2], bobSizes = [2,3]
输出:[1,2]

示例 3:

输入:aliceSizes = [2], bobSizes = [1,3]
输出:[2,3]

示例 4:

输入:aliceSizes = [1,2,5], bobSizes = [2,4]
输出:[5,4]

提示:

  • 1 <= aliceSizes.length, bobSizes.length <= 104
  • 1 <= aliceSizes[i], bobSizes[j] <= 105
  • 爱丽丝和鲍勃的糖果总数量不同
  • 题目数据保证对于给定的输入至少存在一个有效答案

二 🏠破题思路

2.1 🚀 关键信息

解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎

互相交换一盒糖果,拥有相同总数量的糖果,即伪代码如下 🌺🌺🌺

sum1 = count(aliceSizes) , sum2 = count(bobSizes) //两人糖果总数量
sum1 - aliceSizes[x] + bobSizes[y] = sum2 - bobSizes[y] + aliceSizes[x] //交换后等式成立

提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃


2.2 🚀 思路整理

哈希表法:把上述等式转换得 bobSizes[y] = ( sum2 - sum1 + 2 * aliceSizes[x] ) / 2 ,易知可使用哈希表法先将 bobSizes 中的数字存入哈希表, 提升查询效率(方法一) 🌷🌷🌷


双指针法:虽不及哈希表法,但还算巧妙,为开阔思维单列出

首先对 aliceSizesbobSizes 进行排序,定义双指针 i ,jtarget = (sum1 - sum2) / 2 ,双指针分别从已排序的 aliceSizesbobSizes 左端开始移动 🐌🐌🐌


aliceSizes[i] - bobSizes[j] 小于 target ,说明 aliceSizes[i] 小了,++i

aliceSizes[i] - bobSizes[j] 大于 target ,说明 bobSizes[j] 小了,++j

aliceSizes[i] - bobSizes[j] 等于 target ,则说明等式成立,返回结果 🐳🐳🐳


整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃


三 🏠 代码详解

3.1 🚀 代码实现

按照我们刚才的破题思路,直接代码走起来 👇👇👇👇

vector<int> fairCandySwap(vector<int>& aliceSizes, vector<int>& bobSizes) { //哈希表法
    int sumA = accumulate(aliceSizes.begin(), aliceSizes.end(), 0); //求和糖果总数量
    int sumB = accumulate(bobSizes.begin(), bobSizes.end(), 0); //求和糖果总数量
    
    int delta = (sumA - sumB) / 2; //先计算出等式成立的定值
    unordered_set<int> rec(aliceSizes.begin(), aliceSizes.end()); //将aliceSizes放入set

    for (auto& y : bobSizes) { //遍历 bobSizes
        int x = y + delta; //求出满足等式的 aliceSizes 元素值
        if (rec.count(x)) { //若存在于 aliceSizes 
            return{ x, y }; //返回结果
        }
    }
    return {}; //返回结果
}

按照我们刚才的破题思路,直接代码走起来 👇👇👇👇

vector<int> fairCandySwap(vector<int>& aliceSizes, vector<int>& bobSizes) { //双指针法
    int sum1 = accumulate(aliceSizes.cbegin(), aliceSizes.cend(), 0); //求和糖果总数量
    int sum2 = accumulate(bobSizes.cbegin(), bobSizes.cend(), 0); //求和糖果总数量
    
    std::sort(aliceSizes.begin(), aliceSizes.end()); //排序
    std::sort(bobSizes.begin(), bobSizes.end()); //排序

    int target = (sum1 - sum2) / 2; //计算出等式成立的定值
    int i = 0, j = 0; //定义双指针
    int len1 = aliceSizes.size(), len2 = bobSizes.size(); //获取数组长度
    while (i != len1 && j != len2) { //均从左端开始遍历
        int curr = aliceSizes[i] - bobSizes[j]; //计算当前值与等式成立定值比较

        if (curr == target) return{ aliceSizes[i], bobSizes[j] }; //返回结果
        else if (curr > target) ++j; //说明 bobSizes[j] 小了
        else ++i; //说明 aliceSizes[i] 小了
    }

    return{}; //返回结果
}

3.2 🚀 细节解析

看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃

那么我们挖掘上述实现的晦涩细节 😖😖😖 进行解析,直接开干,走起来 👇👇👇👇

unordered_set<int> rec(aliceSizes.begin(), aliceSizes.end()); //将aliceSizes放入set

这里与常规哈希表法不同之处在于,该题不需要对数组各元素计数,而只关心 aliceSizes 值。与哈希表相比,它和数组间转换逻辑更简洁,且 count 方法同样好用 🌼🌼🌼


四 🏠 心路历程

为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈

博主在第一阶段提取 🚀 关键信息并没有问题,在第二阶段 🚀 思路整理中联想到使用哈希表法,未联想到双指针法。但对于实现哈希表法的想法层面,挨个置入哈希表感觉太呆了(未联想到使用 set 解决该问题 😭😭😭)

所以博主的这道题也是在阅读完官方解析后,解出来并加以记录的


五 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

如果各位看官大大觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

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

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

相关文章

【数据链路层】循环冗余码CRC、后退N帧协议GBN、选择重传协议SR、CSMA/CA

文章目录循环冗余码CRC多帧滑动窗口连续ARQ协议后退N帧协议GBN选择重传协议SRCSMA/CA---针对无线局域网处理隐蔽站问题RTS&#xff0c;CTS循环冗余码CRC /*** 计算CRC16校验码** param bytes* return* [1,3,4,1,205,1,18,235,173]*/public static String CRC16(byte[] bytes) {…

终于见识到了微服务的天花板!SpringCloud全线手册,太强了

后台都是在问微服务架构的面试题怎么答&#xff0c;想聊聊微服务架构了。微服务架构一跃成为 IT 领域炙手可热的话题也就这两年的事&#xff0c;大量一线互联网公司因为庞大的业务体量和业务需求&#xff0c;纷纷投入了微服务架构的建设中&#xff0c;像阿里巴巴、百度、美团等…

Kamiya丨Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验说明书

Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验预期用途&#xff1a; 大鼠微量白蛋白酶联免疫吸附试验&#xff08;ELISA&#xff09;是一种高灵敏度的双位点酶联免疫吸附试验&#xff08;ELISA&#xff09;大鼠生物样品中微量白蛋白的测定。仅供研究使用。 引言 白蛋白&#x…

Java项目:ssm学生学籍管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 SSM项目-学生学籍管理系统。该项目分管理员、老师、学生三种用户角色。每种角色分别对应不同的菜单&#xff1b; 以下分别介绍各个角色对应的功…

[附源码]计算机毕业设计springboot基于Java的日用品在线电商平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

二进制数据的贝叶斯非参数聚类算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 部分运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 利用图像结构信息是字典学习的难点,针对传统非参数贝叶斯算法对图像结构信息利用不充分,以及算法运行效率低下的问题,该文…

GoLand2022.2.5版本Hello调动Greetings包

安装Goland2022.2.5 版本 1.官网下载goland-2022.2.5.dmg版本&#xff08;Mac)版本。如果是windows版本也可以直接下载&#xff09; 2.配置gopath&#xff0c;基本都是配置.我这里配置为/usr/local/go 作为全目录&#xff0c;如果是windows&#xff0c;直接在环境中配置path路…

Mysql基础知识篇(二)

1.UNION 与 UNION ALL 的区别&#xff1f; 如果使用 UNION&#xff0c;会在表链接后筛选掉重复的记录行如果使用 UNION ALL&#xff0c;不会合并重复的记录行从效率上说&#xff0c;UNION ALL 要比 UNION 快很多&#xff0c;如果合并没有刻意要删除重复行&#xff0c;那么就使…

自动化测试框架

自动化测试框架1.自动化测试框架核心功能1.数据驱动2.页面驱动3.关键字驱动2.关键字驱动实现-文档形式3.关键字驱动实现-表格形式1.自动化测试框架核心功能 这三种驱动测试可以结合使用来完成系统的自动化测试。可以将测试数据 1.数据驱动 将测试代码和测试数据分离&#xff…

科技云报道:云计算走向工业互联网“深水区”

科技云报道原创。 在新科技革命中&#xff0c;将网格化、信息化与智能化深度融合的工业互联网&#xff0c;正在将人、机、物全面互联&#xff0c;实现全要素、全产业链、全价值链的连接&#xff0c;推动传统产业加快转型升级、助力新兴产业加速发展壮大。 工业如何在快速变革…

培训机构借助创客匠人发力线上业务

疫情反反复复&#xff0c;传统线下教学受到严重影响,转型线上、借力线上发展业务成为行业主流趋势。但是,没有线上经验,人手不足的线下教培机构是否可以转型线上做教学服务,实现招生引流呢? 答案是——可以!用对工具,选对模式,其实很简单! 有很多没有专门线上运营团队,甚至是…

《计算机体系结构量化研究方法》1.7 可信任度

主要内容 计算机是在不同的抽象层上设计和构造的。我们可以逐级深入计算机的不同层面&#xff0c;将每个组件放大为一个完整的子系统进行查看&#xff0c;直到深入到独立的晶体管为止。尽管有些故障会波及整个系统&#xff0c;比如掉电&#xff0c;但许多故障可以被限制在模块…

leetcode-每日一题-1758-生成交替二进制字符串的最少操作数(简单,数学思想)

这道题标记为简单题是正常的&#xff0c;因为当你想到0或者1开头的时候就已经结束了看看我的分析 那么知道这个信息之后就很简单了&#xff0c;加上我们的位运算符号^作为标记即可&#xff0c;大家看看代码实现 1758. 生成交替二进制字符串的最少操作数 难度简单88收藏分享切换…

R语言和Tableau通过情感分析,我们可以从特朗普的推文得到什么?

社交媒体分析的许多用途中的一些是情绪分析&#xff0c;我们评估特定问题的帖子是积极还是消极。我们把社交媒体分析、机器学习、预测建模等集成到文本数据挖掘中。最近我们被客户要求撰写关于推文的研究报告&#xff0c;包括一些图形和统计输出。 在这篇文章中&#xff0c;我…

使用React.ts创建一个密码生成器的简单示例

目录密码生成器DemoFeature知识点React TypeScript —— Function Components为元素(::before/::after)绑定点击事件React如何正确定义对象数组在React中设置复选框check属性三目运算符实现React动态绑定class和style参考资料密码生成器Demo 使用密码生成器工具创建随机密码。P…

Java基于springboot +vue网上超市购物网站 多商家

随着我国信息化的发展&#xff0c;大家更多的是希望通过网络获取到更多的直接所需的信息&#xff0c;而商品一直以来就是人类永恒的追求之一&#xff0c;如何能够享有到更多的商品是很多人一直以来关系的问题。 本系统通过在线网购的方式让用户可以在需要购买商品但是有没有时间…

git submodule创建子仓库

git submodule创建子仓库 文章目录git submodule创建子仓库简介创建主仓库创建子仓库将子仓库添加到主仓库中将合并后的主仓库提交推送到云端简介 当我们的项目伴随着时间的增长越来越大的时候&#xff0c;单一的仓库便不再方便管理&#xff0c;这时候就需要将部分功能提取出来…

PyQt5 事件处理机制

PyQt5 事件处理机制PyQt为事件处理提供了两种机制&#xff1a;高级的信号与槽机制&#xff0c;以及低级的事件处理机制。信号与槽可以说是对事件处理机制的高级封装。 常见事件类型&#xff1a; 键盘事件&#xff1a;按键按下和松开。鼠标事件&#xff1a;鼠标指针移动&#x…

Go语言中的值传递和引用传递 附: 内存地址分析

在学习Go语言函数部分遇到了引用传递和值传递&#xff0c;与C颇为类似&#xff0c;浅谈一下自己对Go语言中的值传递和引用传递的理解。 一、数组—值传递 我们用Go语言中的数组作为样例&#xff0c;来理解值传递的过程。 代码 package mainimport "fmt"func main…

[附源码]计算机毕业设计springboot基于Java的员工管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…