1. 程式人生 > 其它 >leetcode【888-公平的糖果棒交換】思考、優化、改進

leetcode【888-公平的糖果棒交換】思考、優化、改進

技術標籤: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表做法應當更好。