1. 程式人生 > >leetcode 入門第一題 4ms? 8ms? Two Sum

leetcode 入門第一題 4ms? 8ms? Two Sum

 

今天開啟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初體驗,給出的樣例題目當然非常簡單了,歡迎大夥兒入坑~