演算法課第一週作業 | tow sum
阿新 • • 發佈:2019-02-06
寫在前面:
因著演算法課每週作業採用了leetcode這個平臺,據說是個很棒的平臺,以前也有聽說。
而我是第一次使用,註冊完平臺推薦的第一道題便是two sum,第一週以這個簡單開始吧!
題意解讀:
給定一個不定數量以及無序的整數陣列和一個整數結果,從這個陣列中找到兩個數的之和等於這個結果,返回這兩個數在原陣列中的索引。
解題思路:
一開始看到題目就想用簡單的兩層迴圈暴力破解,但想想複雜度為O(n²)應該過不了,做了也沒意義。
之前看過類似的題目,是用雜湊表做出來的,如果用python寫的話,相對簡單。
由於期末考試要求用C/C++,有一段時間沒用了C了,想找找感覺就還是按照要求來吧。
考慮到C++自己實現hashtable好複雜,為快速實現,用了Map代替。
正解思路是迴圈陣列一次,每次判斷當前陣列索引位置的值在不在雜湊表裡,不在的話就加進去,key為陣列的數值,value 為它的索引值。
在裡面的話就取它的key記為n,接下來在雜湊表裡查詢(target-當前數值),找到了就結束。
因為雜湊表查詢元素的時間複雜度為常數,前面也只用了一層迴圈,所以複雜度大大優化為O(n)。
程式碼:
執行結果:class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i, sum; vector<int> results; map<int, int> hashMap; for (int i = 0; i < nums.size(); ++i) { /* code */ if (!hashMap.count(nums[i])) { /* code */ hashMap.insert(pair<int, int>(nums[i], i)); } if (hashMap.count(target - nums[i])) { /* code */ int n = hashMap[target - nums[i]]; if (n < i) { /* code */ results.push_back(n); results.push_back(i); return results; } } } return results; } };
提交後,一次通過,綠色Accepted。