1. 程式人生 > >LeetCode 2.1.7 Two Sum

LeetCode 2.1.7 Two Sum

問題描述:給定一個整數, 從裡面找出兩個數, 其和等於一個指定的整數. 程式返回這兩個數在陣列中的位置( 陣列下標從1開始 ) , 且位置小的在前面. 

問題分析:一開始想的定義兩個指標p1和p2,分別指向陣列的開始和結尾,num[p1] + num[p2]與key的大小,相等則返回,如果key小,p2--,否則p1++,迴圈條件是p1 < p2。但是現在有一種更好的方法就是用雜湊表儲存,這樣只需要遍歷一遍,拿到一個元素時,直接用key減,得到目標值,在雜湊表中找這個目標值,時間複雜度為O(1),找到就直接返回這兩個下標,找不到就繼續遍歷。

程式碼:

class
Solution {
public: vector<int> twoSum(vector<int> &num,int key) { unordered_map<int,int> map;//雜湊表 vector<int> result; for(int i = 0; i < num.size();i++)//插入到容器map { map[num[i]] = i;//key為num[i],value為i } for(int i = 0; i < num.size();i++)//遍歷容器 { const
int gap = key - num[i]; if(map.find(gap) != map.end() && map[gap] > i) { result.push_back(i + 1); result.push_back(map[gap] + 1); break; } } return result; } };