leetcode【888-公平的糖果棒交換】思考、優化、改進
阿新 • • 發佈:2021-02-15
技術標籤:leetcode思考優化與改進演算法leetcode
聲
明
:
該
系
列
是
我
的
隨
筆
,
會
記
錄
一
些
刷
題
的
感
受
,
思
路
。
文
章
難
免
有
錯
誤
或
語
句
不
夠
嚴
謹
,
歡
迎
指
正
。
\color{#FF0000}{宣告:該系列是我的隨筆,會記錄一些刷題的感受,思路。文章難免有錯誤或語句不夠嚴謹,歡迎指正。 }
聲明:該系列是我的隨筆,會記錄一些刷題的感受,思路。文章難免有錯誤或語句不夠嚴謹,歡迎指正。
如
果
讀
者
關
於
這
道
題
有
其
他
疑
問
,
也
歡
迎
在
評
論
區
和
我
討
論
我
會
及
時
回
復
,
互
相
進
步
,
謝
謝
!
\color{#FF0000}{如果讀者關於這道題有其他疑問,也歡迎在評論區和我討論我會及時回覆,互相進步,謝謝!}
如果讀者關於這道題有其他疑問,也歡迎在評論區和我討論我會及時回復,互相進步,謝謝!
2月1日的每日一題,又是ALICE和BOB搞事情。拿到這個題思路應當是比較明確的。抽象為數學模型:從A中選擇一個數,從B中選擇一個數,交換後使得A的總和等於B的總和。一個很容易想出來的思路是先計算出A,B當前總和,再求差得出derta1,在A,B中找兩個數字使得他們的差值為-derta1。
class Solution {
public:
vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
sort(A.begin(),A.end());
sort(B.begin(),B.end());
int sumA = 0,sumB = 0,derta,dertaN;
for(int i =0;i!=A.size();++i)
sumA += A[i];
for(int i =0;i!=B.size();++i)
sumB += B[i];
derta = (sumA-sumB)/2;
int i = 0;
int j = 0;
while(dertaN!= derta)
{
dertaN = A[i] - B[j];
if(dertaN> derta)
j++;
if(dertaN<derta)
i++;
}
return {A[i],B[j]};
}};
這是一個經典的雙指標問題,只需注意一些細節:
1.A陣列和B陣列長度不一定相同,要分別計算,也可以使用accumulate函式
2.本身陣列是無序的需要sort函式排序,這就使得時間複雜度變為O(nlogn)。 所以這個題排序應當不是最優解。
結果還行,相必應當是資料集太小了。不然選用官方的HASH表做法應當更好。