愛麗絲和鮑勃有不同大小的糖果棒: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]
思路1:
計算ab兩個陣列的差值dvalue,尋找ab陣列中元素相差為dvalue的數值對。 時間複雜度為o(n^2)
class
solution
for(
int i =
0; i < b.length; i++
)// 按照題意,dvalue只能是偶數,否則不會成立
dvalue = asum - bsum;
for(
int i =
0; i < a.length; i++);
}}}// can not reach here;
return
newint[2
];}}
這也是最簡單的思路,也是我想到的,但是尋找ab陣列中元素相差為dvalue的數值對的方法是不經濟的,因為我們沒有管a,b兩個陣列的順序,而是兩個陣列直接遍歷尋找,如果ab兩個陣列是有序的,我們可以更加快速找到兩個元素的位置。就是思路2。
思路2:
計算ab兩個陣列的差值dvalue,對ab陣列排序,有規則地尋找ab陣列中元素相差為dvalue的數值對。 時間複雜度為o(n^2)
class
solution
for(
int j : b)
// 排序
arrays.
sort
(a);
arrays.
sort
(b);
// 計算需要交換糖果的大小差值
int temp = suma -
(suma + sumb)/2
;int i =
0, j =0;
// 有規則的尋找
while
(i < a.length && j < b.length)
else
if(a[i]
- b[j]
> temp)
else
if(a[i]
- b[j]
< temp)
}return ans;
}}
思路3:
為了加快查詢,我們也可以採用hash表。因為我們可以假設需要交換的元素為[x,y],
則有公式 suma -x + y = sumb + x -y => x = y + (suma - sumb)/2。
所以只要
計算ab兩個陣列的差值dvalue,對ab陣列排序,有規則地尋找ab陣列中元素相差為dvalue的數值對。 時間複雜度為o(n^2)
class
solution
int[
] ans =
newint[2
];for(
int y : b)
}return ans;
}}
888 公平交換糖果棒
愛麗絲和鮑勃有不同大小的糖果棒 a i 是愛麗絲擁有的第 i 根糖果棒的大小,b j 是鮑勃擁有的第 j 根糖果棒的大小。因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。返回乙個整數陣列 ans,其中 ans 0 是愛麗...
888 公平的糖果棒交換
題目描述 愛麗絲和鮑勃有不同大小的糖果棒 a i 是愛麗絲擁有的第 i 根糖果棒的大小,b j 是鮑勃擁有的第 j 根糖果棒的大小。因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。返回乙個整數陣列 ans,其中 ans ...
888 公平的糖果棒交換
愛麗絲和鮑勃有不同大小的糖果棒 a i 是愛麗絲擁有的第i根糖果棒的大小,b j 是鮑勃擁有的第j根糖果棒的大小。因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。返回乙個整數陣列ans,其中ans 0 是愛麗絲必須交換的...