LeetCode 2.1.7 Two Sum
阿新 • • 發佈:2018-11-23
問題描述:給定一個整數, 從裡面找出兩個數, 其和等於一個指定的整數. 程式返回這兩個數在陣列中的位置( 陣列下標從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;
}
};