1. 程式人生 > >演算法課第一週作業 | tow sum

演算法課第一週作業 | tow sum

寫在前面:

因著演算法課每週作業採用了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。