這是悅樂書的第339次更新,第363篇原創
java
今天介紹的是LeetCode算法題中Easy級別的第208題(順位題號是888)。Alice和Bob有不一樣大小的糖果棒:A[i]是Alice擁有的第i個糖果棒的大小,B[j]是Bob擁有的第j個糖果棒的大小。算法
因爲他們是朋友,他們想交換一個糖果,以便交換後,他們都有相同的糖果總量。 (一我的擁有的糖果總量是他們擁有的糖果大小的總和。)數組
返回一個整數數組ans,其中ans[0]是Alice必須交換的糖果的大小,ans[1]是Bob必須交換的糖果的大小。數據結構
若是有多個答案,你能夠返回其中任何一個。答案保證存在。例如:eclipse
輸入: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]code
注意:ip
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語言編寫和測試。
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; }
針對第一種解法使用的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; }
算法專題目前已連續日更超過六個月,算法題文章208+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!