LeetCode 1 Two Sum 解題報告
偶然間聽見leetcode這個平台,這里面題量也不是很多200多題,打算平時有空在研究生期間就刷完,跟跟多的練習算法的人進行交流思想,一定的ACM算法積累可以對以后在對算法中優化帶來好處。Ok,今天是我做的第一題Add Two Sum。
題目要求
Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2
題目分析
第一次刷LeetCode,太大意了,以為第一題很簡單,兩層循環,結果 time limit out 超時了。然后看了一眼show tag 尼瑪,上檔了,果然得用哈希的方法來做。
思路:
根據題目的要求給定一個數組,從中選出兩個數,使得兩個數的和等於target目標值。
解法如下:
1. 首先將數組的數插入到map中,同時map的key為數組的值,而value等於數組的下標
2. 從map開始遍歷,從target減去當前的iter->first 即value1,這里first是鍵也是原來numbers數組中的值
3. 得到另一個值value2,查看map中是否存在該鍵,若存在看value1+value2是否等於target
4. 若等於target判斷,是否為target的二分之一,因為會出現相同的值,若target為一個value值的兩倍,從數組充查找是否存在有兩個value,若存在則加入reslut
5. 若不是,則從map中直接取出鍵所對應的值,按小的在前的順序放入result,因為map中“值”存放的是實際數組的下標,“鍵”存放的是實際數組中的值。最后輸出result即可。
示例代碼
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
vector<int> result;
map<int,int> nummap;
map<int,int>::iterator i;
for(int i = 0 ;i < numbers.size(); i++)
nummap.insert(make_pair(numbers[i],i+1));//map中key存放numbers數組的值,value存放下標
for(map<int ,int >::iterator iter = nummap.begin(); iter!= nummap.end(); iter++)
{
int value1 = iter->first;
int value2 = target - value1;
i = nummap.find(value2);
if( i != nummap.end())
{
if(value1 + value2 == target)
{
if(value1 == value2)//看找到的值是否為target的二分之一,若是二分之一,必須存在2個才符合要求
{
vector<int>::iterator j;
vector<int>::iterator k = find (numbers.begin(), numbers.end(), value1);
if(k!= numbers.end())//看是否存在兩個
{
j = find(k+1, numbers.end(), value1);
if(j!= numbers.end())
{
result.push_back(k-numbers.begin()+1);
result.push_back(j-numbers.begin()+1);
return result;
}
}
}
else//若不是二分之一,說明存在兩個不同下標的不同值相加為target,從map中取出他們相應的索引
{
result.push_back(min(nummap[value1],nummap[value2]));
result.push_back(max(nummap[value1],nummap[value2]));
return result;
}
}
}
}
return result;
}
};
int main ()
{
Solution s1;
int num[] ={0, 2, 4, 0};
vector<int> numbers (num,num+4);
int target = 0;
vector<int> result = s1.twoSum(numbers, target);
for(int i = 0 ;i < result.size(); i++)
{
cout<< result[i]<<endl;
}
return 0;
}