zoukankan      html  css  js  c++  java
  • Leetcode 888公平的糖果交易

    题目定义:

    爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,
    B[j] 是鲍勃拥有的第 j 根糖果棒的大小。
    因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。
    (一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
    返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,
    ans[1] 是 Bob 必须交换的糖果棒的大小。
    如果有多个答案,你可以返回其中任何一个。保证答案存在。
    
    示例 1:
    输入:A = [1,1], B = [2,2]
    输出:[1,2]
        
        
    示例 2:
    输入:A = [1,2], B = [2,3]
    输出:[1,2]
        
        
    示例 3:
    输入:A = [2], B = [1,3]
    输出:[2,3]
        
        
    示例 4:
    输入:A = [1,2,5], B = [2,4]
    输出:[5,4]
    

    方式一(双指针):

    class Solution {
        public int[] fairCandySwap(int[] A, int[] B) {
            int[] res = new int[2];
            int sumA = sum(A),sumB = sum(B);
            Arrays.sort(A);
            Arrays.sort(B);
            int temp = sumA - ((sumA + sumB) >> 1);
            int i = 0, j = 0;
            while(i < A.length && j < B.length){
                if(A[i] - B[j] == temp){
                    res[0] = A[i];
                    res[1] = B[j];
                    break;
                }else if(A[i] - B[j] > temp){
                    j++;
                }else{
                    i++;
                }
            }
            return res;
        }
    
        private int sum(int[] res){
            int sum = 0;
            for (int i : res) {
                sum += i;
            }
            return sum;
        }
    }
    

    方式二(哈希表):

    /*
    * 思路: 
    	记爱丽丝的糖果棒的总大小为 sumA,鲍勃的糖果棒的总大小为sumB。
    设答案为 {x,y},即爱丽丝的大小为 x 的糖果棒与鲍勃的大小为 y 的糖果棒交换,
    则有如下等式:
    		sumA - x + y  =  sumB + x - y
       化简得:
       	        x = y + (sumA - sumB) / 2
       也得:
       	       y = (sumB - sumA + x * 2) >> 1
    
    */
    class Solution {
        public int[] fairCandySwap(int[] A, int[] B) {
            int[] res = new int[2];
            Set<Integer> set = arrayToSet(B);
            int sumA = sum(A),sumB = sum(B);
            for(int a : A){
                if(set.contains((sumB - sumA + a * 2) >> 1)){
                    res[0]  = a;
                    res[1] = (sumB - sumA + a * 2) >> 1;
                    break;
                }
            }
            return res;
        }
        private Set<Integer> arrayToSet(int[] res){
            Set<Integer> set = new HashSet<>();
            for (int i : res) {
                set.add(i);
            }
            return set;
        }
        private int sum(int[] res){
            int sum = 0;
            for(int i : res)
                sum += i;
            return sum;
        }
    
    }
    

    参考:

    https://leetcode-cn.com/problems/fair-candy-swap/solution/gong-ping-de-tang-guo-jiao-huan-by-leetc-tlam/

  • 相关阅读:
    选择 冒泡 快速 插入排序
    类方法
    Java--静态区域块
    打印字母如何显示声调
    navicat 创建的表,username字段不能接受中文名字。
    C++primer plus第六版课后编程题答案10.8(来个高手教教我)
    C++primer plus第六版课后编程题答案10.7
    C++primer plus第六版课后编程题答案10.6
    错误 1 error C2143: 语法错误 : 缺少“;”(在“using”的前面)
    C++primer plus第六版课后编程题答案10.5
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/14355789.html
Copyright © 2011-2022 走看看