这是悦乐书的第339次更新,第363篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第208题(顺位题号是888)。Alice和Bob有不同大小的糖果棒:A[i]是Alice拥有的第i个糖果棒的大小,B[j]是Bob拥有的第j个糖果棒的大小。

由于他们是朋友,他们想交换一个糖果,以便交换后,他们都有相同的糖果总量。 (一个人拥有的糖果总量是他们拥有的糖果大小的总和。)

返回一个整数数组ans,其中ans[0]是Alice必须交换的糖果的大小,ans[1]是Bob必须交换的糖果的大小。

如果有多个答案,你可以返回其中任何一个。答案保证存在。例如:

输入:A = [1,1],B = [2,2]

输出:[1,2]

输入:A = [1,2],B = [2,3]

输出:[1,2] [2,3]

输入:A = [2],B = [1,3]

输出:[2,3]

输入:A = [1,2,5],B = [2,4]

输出:[5,4]

注意

  • 1 <= A.length <= 10000

  • 1 <= B.length <= 10000

  • 1 <= A [i] <= 100000

  • 1 <= B [i] <= 100000

  • 保证Alice和Bob的糖果总量不同。

  • 保证有答案。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

Alice和Bob的糖果总量不一样,要想答案肯定存在,他们两人的糖果总量差值肯定为偶数,只有差值为偶数时,对差值进行平分得到一个平均值,糖果总量多的一方减去平均值,少的一方加上平均值,此时两人的糖果总量是相等的。

因此,我们只需要求出两人的糖果总量差值的平均数,拿此平均数加上一方中的任意一个糖果的大小,去匹配另外一方中的糖果大小,能够匹配上,说明这两个糖果是需要双方交换的,在此情景下,此题有点类似于Two Sum。

public int[] fairCandySwap(int[] A, int[] B) {
int[] result = new int[2];
// 存储A中的元素(换成B也行)
Set<Integer> set = new HashSet<Integer>();
int sumA = 0;
for (int a : A) {
sumA += a;
set.add(a);
}
int sumB = 0;
for (int b : B) {
sumB += b;
}
// 两人糖果总量之差的平均数
int num = (sumA-sumB)/2;
// 遍历B中元素,加上差值平均数去另外一个数组里匹配,
// 能匹配上,表明遇到了需要交换的元素。
for (int b : B) {
if (set.contains(b+num)) {
return new int[]{b+num, b};
}
}
return result;
}

03 第二种解法

针对第一种解法使用的HashSet,我们还可以换成另外的数据结构来代替,使用一个boolean类型的数组来存储A中的值,其他思路不变。

public int[] fairCandySwap2(int[] A, int[] B) {
int[] result = new int[2];
boolean[] set = new boolean[100001];
int sumA = 0;
for (int a : A) {
sumA += a;
set[a] = true;
}
int sumB = 0;
for (int b : B) {
sumB += b;
}
int num = (sumA-sumB)/2;
for (int b : B) {
if (b+num > 0 && b+num < 100001 && set[b+num]) {
return new int[]{b+num, b};
}
}
return result;
}

04 小结

算法专题目前已连续日更超过六个月,算法题文章208+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.888-公平的糖果交换(Fair Candy Swap)的更多相关文章

  1. [Swift]LeetCode888. 公平的糖果交换 | Fair Candy Swap

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  2. 888. 公平的糖果交换--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/fair-candy-swap 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 假 ...

  3. 888. Fair Candy Swap@python

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  4. 【Leetcode_easy】888. Fair Candy Swap

    problem 888. Fair Candy Swap solution: class Solution { public: vector<int> fairCandySwap(vect ...

  5. 【LeetCode】888. Fair Candy Swap 公平的糖果棒交换(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号: 每日算法题 本文关键词:力扣,LeetCode,算法题,算法,Python 目录 题目描述 题目大意 解题方法 代码 刷题心得 关于作 ...

  6. [LeetCode] 888. Fair Candy Swap 公平糖果交换

    Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy that Ali ...

  7. C#LeetCode刷题之#888-公平的糖果交换(Fair Candy Swap)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3758 访问. 爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝 ...

  8. Leetcode888.Fair Candy Swap公平的糖果交换

    爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 块糖的大小,B[j] 是鲍勃拥有的第 j 块糖的大小. 因为他们是朋友,所以他们想交换一个糖果棒,这样交换后,他们都有相同的糖果总量.( ...

  9. LeetCode 888 Fair Candy Swap 解题报告

    题目要求 Alice and Bob have candy bars of different sizes: A[i] is the size of the i-th bar of candy tha ...

随机推荐

  1. mqtt-client回调方法简介

    mqtt-client回调方法简介 毫无疑问Callback方式是最复杂的一种,但是其也是能够提供更好的服务,因此有必要好好研究,下面就是对使用回调方式的简单介绍: 一.在使用回调方式前,先通过MQT ...

  2. brew 安装的.net 运行时提示"Did you mean to run dotnet SDK commands?"

    原因未知,但有解决方案 使用 brew cask 安装的.NET Core brew cask install dotnet 结果运行时出现: 解决方案: 下载官方 .pkg 文件安装,顺便卸载掉 b ...

  3. sessionStorage和localStorage存储的转换不了json

    先说说localStorage与sessionStorage的差别 sessionStorage是存储浏览器的暂时性的数据,当关闭浏览器下次再打开的时候就不能拿到之前存储的缓存了 localStora ...

  4. Robot Framework(六)变量

    变量 2.5.1简介 变量是Robot Framework的一个不可或缺的特性,它们可以在测试数据的大多数地方使用.最常见的是,它们用于测试用例表和关键字表中关键字的参数,但所有设置都允许在其值中使用 ...

  5. 通过分析反汇编还原 C 语言 if…else 结构

    让我们从反汇编的角度去分析并还原 C 语言的 if - else 结构,首先我们不看源代码,我们用 OllyDBG 载入 PE 文件,定位到 main 函数领空,如下图所示. 在图示中,我已经做好了关 ...

  6. GDI 画刷(10)

    创建画刷 调用 CreateSoildBrush.CreateHatchBrush.CreateBrushIndirect 函数可以创建画刷. CreateSoildBrush:创建实心画刷: Cre ...

  7. 字符串函数(day11)

    使用存储区的地址作为返回值可以让调用 函数使用被调用函数的存储区 这种时候被调用函数需要提供一个指针类型 的存储区记录作为返回值的地址数据 不可以把非静态局部变量的地址作为返回值 使用 C语言里的文字 ...

  8. open-ldap服务安装(1)

    LDAP简介 LDAP 代表 轻量级目录访问协议.在我的理解中ldap就是一个数据库. 在LDAP中,目录条目以分层树状结构排序. 传统上,这种结构反映了地理和组织边界,表示国家/地区的条目显示在树的 ...

  9. Django链接Mysql 8.0 出现错误(1045:Access denied for user 'root'@'localhost' (using password: NO) 的一种解决方法

    运行环境: Django版本2.0 ; Mysql 版本 8.0.11; 错误代码:  django.db.utils.OperationalError: (1045:Access denied fo ...

  10. Cloudera 5.8.3 SolrCloud+HDFS的索引数据备份和恢复。(需重启solr进程。)

    一.备份基于HDFS的solrCloud集合数据 1.确认要备份的solr文件夹. /solr/history_customer_collection_test 2.开启HDFS快照功能. hdfs ...