二月開始了,爭取每天都能打開寫文章
LeetCode上公平的糖果棒交換,簡單難度,記錄下解題思路
已知兩個數組,當交換數組中一個數的時候,兩個數組的和會相等,那么可知
sumA - A中交換的數 + B中交換的數 = sumB - B中交換的數 + A中交換的數
通過變換可以得到下面的公式:
A中交換的數 = (sumA - sumB + 2*B中交換的數)/ 2
B中交換的數 = (sumB - sumA + 2*A中交換的數)/ 2
那么假設確定了要交換的數為b,則要求要交換的a可以通過
var fairCandySwap = function (A, B) {
// 通過reduce求AB的和
let sumA = A.reduce((a,b) => {return a+b},0)
let sumB = B.reduce((a,b) => {return a+b},0)
// 根據公式A中交換的數 = (sumA - sumB + 2*B中交換的數)/ 2
let sum = sumA - sumB
for(let i=0;i<B.length;i++) {
// 假設當前B[i]是確定的,那要根據當前B[i]求出對應的要交換的a
// 如果要交換的a存在于A中那么這個就成立,就輸出這個數組
// 定義要交換的a
let a = (sum + 2*B[i]) / 2
// 通過indexof來判斷A中是否有這個數,如果有的話就是可以交換的
if(A.indexOf(a) !== -1) {
// 返回這個數組
return [a,B[i]]
}
}
}