888 陣列 公平的糖果棒交換

2021-10-18 14:11:30 字數 1983 閱讀 1607

愛麗絲和鮑勃有不同大小的糖果棒: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 是愛麗絲必須交換的...