888. 公平的糖果棒交換(力扣)
阿新 • • 發佈:2021-02-04
技術標籤:練習題
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]
首先我們可以知道,因為題目保證肯定有結果,那麼我們可以知道,他們的總和肯定可以平均分成兩部分,他們多出來的肯定是能被二整除。
舉個栗子
甲同學有12元,乙同學有8元,要使他倆的錢數相同,我們應該怎樣分?
我們中的腦回路可能是這樣,1.他倆現在的錢各是多少?2.他倆的差是多少?3.把多餘的這部分平均分給甲乙兩位同學。4.問題解決。
程式碼如下,以下僅是本人的一些想法,有問題請指出,謝謝!!!若有更好的辦法,歡迎留言。
var fairCandySwap = function(A, B) { let aSum=0,bSum=0;//分別統計A,B中糖果的總和 let cha ;//計算(A-B)/2的差為多少 let res = [];//待返回交換的值 let Alength = A.length,Blength = B.length; var i=0,j=0; A.sort((a,b)=>{//箭頭函式的使用,es6中有介紹 return a-b; }); B.sort((a,b)=>{ return a-b; }); while((Alength>0)||(Blength>0)){//分別統計A,B中糖果的總和 Alength--; Blength--; if(Alength>-1){ aSum += A[Alength] } if(Blength>-1){ bSum += B[Blength]; } } cha = (aSum - bSum)/2;//求差 while(i<A.length&&j<B.length){ if(A[i]-B[j]>cha){ j++;} else if(A[i]-B[j]<cha){ i++;} else{ res.push(A[i]); res.push(B[j]); break; } } return res; };