三、總結
愛麗絲和鮑勃有不同大小的糖果棒:a[i] 是愛麗絲擁有的第 i 根糖果棒的大小,b[j] 是鮑勃擁有的第 j 根糖果棒的大小。記愛麗絲的糖果棒的總大小為suma,鮑勃的糖果棒的總大小為 sumb。設所求為 ,即愛麗絲的大小為 x 的糖果棒與鮑勃的大小為 y 的糖果棒交換,則有如下等式:suma - x + y =sumb + x - y 化簡,得:x = y + ((suma - sumb)/ 2 )。因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。(乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。)返回乙個整數陣列 ans,其中 ans[0] 是愛麗絲必須交換的糖果棒的大小,ans[1] 是 bob 必須交換的糖果棒的大小。
如果有多個答案,你可以返回其中任何乙個。保證答案存在。
即對於 b 中的任意乙個數 y』,只要 a 中存在乙個數 x』,滿足 x』 = y』 + ((suma - sumb)/ 2 )。那麼 即為一組可行解。
為了快速查詢 a 中是否存在某個數,我們可以先將 a 中的數字存入雜湊表中。然後遍歷 bb 序列中的數 y』,在雜湊表中查詢是否有對應的 x』。
**如下(示例):
struct hashtable
;int
*faircandyswap
(int
* a,
int asize,
int* b,
int bsize,
int* returnsize)
for(
int i =
0; i < bsize; i++
)int delta =
(suma - sumb)/2
;struct hashtable* hashtable =
null
;for
(int i =
0; i < asize; i++)}
int* ans =
malloc
(sizeof
(int)*
2);for
(int i =
0; i < bsize; i++)}
return ans;
}
記愛麗絲的糖果棒的總大小為suma,鮑勃的糖果棒的總大小為 sumb。設所求為 ,即愛麗絲的大小為 x 的糖果棒與鮑勃的大小為 y 的糖果棒交換,則有如下等式:suma - x + y =sumb + x - y 化簡,得:x = y + ((suma - sumb)/ 2 )。
即對於 b 中的任意乙個數 y』,只要 a 中存在乙個數 x』,滿足 x』 = y』 + ((suma - sumb)/ 2 )。那麼 即為一組可行解。
因為答案必然存在,我們可以將a與b按公升序進行排序,利用雙指標記錄當前a[i]與b[j]的資訊,通過與(suma - sumb)/ 2 進行比較判斷當前指標指向的一組糖果棒是否為可行解。
**如下(示例):
int cmp (
const
void
* a,
const
void
*b)int
*faircandyswap
(int
* a,
int asize,
int* b,
int bsize,
int* returnsize)
for(
int i =
0;i < bsize;i++
)int diff =
(suma - sumb)/2
;int i =
0,j =0;
while
(i < asize && j else
if(a[i]
- b[j]
< diff)
else
}return ans;
}
官方認定為簡單題,解題相關思路還蠻有意思的,雜湊表永遠滴神! LeetCode 888 公平的糖果交換
leetcode習題答案彙總 題目 愛麗絲和鮑勃有不同大小的糖果棒 a i 是愛麗絲擁有的第 i 塊糖的大小,b j 是鮑勃擁有的第 j 塊糖的大小。因為他們是朋友,所以他們想交換乙個糖果棒,這樣交換後,他們都有相同的糖果總量。乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。返回乙個整數陣列 an...
leetcode 888 公平的糖果棒交換
愛麗絲和鮑勃有不同大小的糖果棒 a i 是愛麗絲擁有的第 i 根糖果棒的大小,b j 是鮑勃擁有的第 j 根糖果棒的大小。因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。返回乙個整數陣列 ans,其中 ans 0 是愛麗...
leetcode 888 公平的糖果棒交換
888.公平的糖果棒交換 愛麗絲和鮑勃有不同大小的糖果棒 a i 是愛麗絲擁有的第i根糖果棒的大小,b j 是鮑勃擁有的第j根糖果棒的大小。因為他們是朋友,所以他們想交換一根糖果棒,這樣交換後,他們都有相同的糖果總量。乙個人擁有的糖果總量是他們擁有的糖果棒大小的總和。返回乙個整數陣列ans,其中an...