首页 > 其他分享 >leet code 888.公平的糖果交换

leet code 888.公平的糖果交换

时间:2023-09-12 14:05:30浏览次数:29  
标签:leet code int sum 888 aliceSizes 爱丽丝 diff 糖果

888.公平糖果交换

题目解析

  • 题目中给定了两个数组,而并没有明确给定数组是否已经排序,所以需要先对目标数组进行排序
  • 然后需要计算两个数组的差值,从而确定哪一方交换出更多的糖果,即 爱丽丝 或 鲍勃 那一方 付出更多的糖果
  • 假设其中一方需要付出较多的糖果数量记为 leet code 888.公平的糖果交换_二分查找
  • 另一方需要付出较少的糖果数量记为 leet code 888.公平的糖果交换_数组_02
  • 那么有
  • 为什么是 leet code 888.公平的糖果交换_数组_03
  • 假设 爱丽丝 一共有 10 个糖果,鲍勃有 8 个糖果,他们相差了 两个糖果。
  • 10 - 爱丽丝付出的糖果 + 鲍勃付出的糖果 = 9
  • 即,爱丽丝付出的糖果数 - 鲍勃付出的糖果数 = (爱丽丝的糖果数 - 鲍勃的糖果数)/ 2
  • 因此需要从付出较多糖果的一方寻找 大于 的元素 ,判断其是否可以找到匹配的
  • 从而满足leet code 888.公平的糖果交换_数组_04
  • 运用二分查找,轻松解决问题!

show code

public int[] fairCandySwap(int[] aliceSizes, int[] bobSizes) {
        Arrays.sort(aliceSizes);
        Arrays.sort(bobSizes);

        int sum_alice = Arrays.stream(aliceSizes).sum();
        int sum_bob = Arrays.stream(bobSizes).sum();

        if(sum_alice > sum_bob) {
            int diff = sum_alice - sum_bob;
            // 爱丽丝 需要交换出更多的糖果--去交换鲍勃较少的糖果.

            for (int aliceSize : aliceSizes) {
                // 需要减少的糖果数量是 diff / 2
                if(aliceSize < diff / 2) {
                    continue;
                }
                // 从 bobSizes 数组中寻找元素  aliceSize - diff / 2
                int i = binarySearch(bobSizes, aliceSize - diff / 2);
                if(i != -1) {
                    return new int[]{aliceSize, i};
                }
            }
        } else {
            int diff = sum_bob - sum_alice;
            // 鲍勃 付出更多的糖果 -- 去交换 爱丽丝较少的糖果.
            for (int bobSize : bobSizes) {
                if(bobSize < diff / 2) {
                    continue;
                }
                // 从 aliceSizes 数组中寻找元素  bobSize - diff / 2
                int i = binarySearch(aliceSizes, bobSize - diff / 2);
                if(i != -1) {
                    return new int[]{i, bobSize};
                }
            }
        }

        return null;
    }

    private int binarySearch(int[] sizes, int target) {
        int n = sizes.length;
        int left = 0,right = n -1;
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if(sizes[mid] == target) {
                return target;
            } else if(sizes[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        return -1;
    }

标签:leet,code,int,sum,888,aliceSizes,爱丽丝,diff,糖果
From: https://blog.51cto.com/u_16079703/7444996

相关文章

  • leetcode841钥匙和房间
    使用深度优先遍历构造的图,只要访问过就标记已访问intnum=0;vector<bool>vis;voiddfs(vector<vector<int>>&rooms,intx){vis[x]=true;num++;for(auto&v:rooms[x]){if(!vis[v])dfs(rooms,v);//说明这个房间没有进去过,所以可以访问}}intmai......
  • Codeforces Round 896 (Div. 2)
    CodeforcesRound896(Div.2)A.MakeItZero代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingi128=__int128;intn,m;voidsolve(){scanf("%d",&n);vector<int>a(n+1);for(inti......
  • 关于Spring i18n国际化 报错No message found under code * for locale 'zh_CN'.的解
    第一步创建资源文件国际化文件命名格式:基本名称_语言_国家.properties 这里我建了两个配置文件,一个是zh_CN中文的,一个是en_GB英文的,然后在里面随便写点测试文本语句第二步bean.xmlspring配置文件1<?xmlversion="1.0"encoding="UTF-8"?>2<beansxmlns="http:/......
  • leetcode450删除搜索二叉树的节点
    删除的二叉树节点分4种情况:叶子节点,直接删除就行左节点不为空,右节点为空;直接将左子树返回左节点为空,右节点不为空;直接将右子树返回左节点和右节点不为空;将右子树最小的节点作为根节点,返回右子树TreeNode*deleteNode(TreeNode*root,intkey){if(!root)returnn......
  • Leetcode 26. 删除有序数组中的重复项
    题目描述给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。双指针Python实现defremoveDuplicates(nums:List[int])->int:......
  • 程序员 AI 助手来了,蚂蚁正式开源代码大模型 CodeFuse
    9月8日,外滩大会分论坛上,蚂蚁集团首次开源了代码大模型CodeFuse。支付宝小程序云负责人李铮宣布CodeFuse正式开源这是蚂蚁自研的代码生成专属大模型,根据开发者的输入提供智能建议和实时支持,帮助开发者自动生成代码、自动增加注释,自动生成测试用例,修复和优化代码等,以提升研发......
  • 日常使用vscode开发flutter相关的插件
    简介这里整理了日常使用vscode开发flutter相关的插件,也有部分通用类型的插件Flutter&Dart这2个是flutter官方插件,开发flutter装机必备,不用多说。AwesomeFlutterSnippetsAwesomeFlutterSnippetsisacollectionsnippetsandshortcutsforcommonlyusedFlutterfunctions......
  • onBackPressed 设置返回值,onActivityResult resultcode一直是0
    activity1:Intentintent2=newIntent(this,checkactivity.class);startActivityForResult(intent2,1000);activity2:@OverridepublicvoidonBackPressed(){super.onBackPressed();Intentintent=newIntent();setResult(result,in......
  • vsCode代码块无法折叠收起问题&代码块折叠/展开快捷键
    https://blog.csdn.net/Maybe_ss/article/details/122577167https://blog.csdn.net/Felaim/article/details/125971296......
  • 工具:vscode折叠任意想折叠的代码块
    https://blog.csdn.net/qq_43548684/article/details/131958032?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-131958032-blog-122577167.235%5Ev38%5Epc_relevant_default_base&depth_1-utm_source=......