leetcode 入門第一題 4ms? 8ms? Two Sum
阿新 • • 發佈:2018-11-17
今天開啟leetcode
題意很簡單,就是一個數組中求取兩數之和等於目標數的一對兒下標
1.暴力 n^2
兩個for迴圈遍歷
用時0.1s 開外
程式碼就不用寫了
2.二分 nlogn
我們可以遍歷選擇每一個元素 ,然後二分剩餘(target - ai)
(一)從全序列二分剩餘
這就需要考慮下標和自己重疊的情況,比如【3,3】,target:6
於是我們就需要判重疊
程式碼就長成下面這樣了(8ms)
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { multimap<int, int> P; for (int i = 0; i < nums.size(); ++i) P.insert(pair<int, int>(nums[i], i)); for (auto i : P) { map<int, int>::iterator j = P.find(target - i.first); if(j != P.end() && i.first + j->first == target) { if (i.second == j->second) { ++j; if (i.first + j->first != target)continue; } vector<int> V; V.push_back(i.second); V.push_back(j->second); return V; } } } };
因為後面四行用於return的程式碼太長了,看著不舒服,於是改成了
int a[2]{i.second,j->second}; return vector<int>(a,a+2);
額外加時了4ms。。還是算了=.=
(二)從當前位置之前二分剩餘
接著看了下這道題的提交情況,發現竟然有4ms過的,(當然也有0ms的,非正常人,這個可以忽略)
官方程式碼:
結果跑了8ms,可能是我臉黑,也可能資料增加了,或者,是個玄學測評機?
可以看到這個程式碼就屬於從頭到尾一次插入,剛開始是空的,邊找邊插,找完之後再把當前位置插入序列,這樣就可以避免找到自己本身
咦~,這貌似是個好辦法,學習了~
到此,還不能說明方法(一)不好或者方法(一)略微複雜
我們對於找答案佛系一點,或許就,見到了奇蹟
【3,3】target = 6,同樣,第一次(3,0)會找到(3,0),我們可以跳過,(3,1)自然會找到(3,0)進行匹配,自動化隨緣法
另:leetcode可能不支援unordered_map或者unordered_multimap中的lower_bound和upper_bound,我也不清楚到底有沒有,我只知道VS是有的。
這篇單單是記錄一下leetcode初體驗,給出的樣例題目當然非常簡單了,歡迎大夥兒入坑~