#167 Two Sum II - Input array is sorted
Given an array of integers that is already sorted in ascending order, 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.
Note:
- Your returned answers (both index1 and index2) are not zero-based.
- You may assume that each input would have exactly one solution and you may not use the same element twice.
Input: numbers = [2,7,11,15], target = 9
Output: [1,2]
Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.
1、哈希表
和之前的sum一样的做法。循环遍历,判断补数,map用键访问。是可以通过,但是没有利用好数组是升序的,是一种通用解法。
注意一个地方,就是vector<int>re申明的时候,一定要给定大小(2),否则下面不可以用[0]访问,因为它的size=0。但是可以用push_back()。
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
//这个题目是不是做过呀,哈希表来做
map<int,int>hash_table;
int numSize=numbers.size();
vector<int> re(2);
for(int i=0;i<numSize;i++)
{
if(hash_table.find(numbers[i])!=hash_table.end())
{
//因为是从0开始遍历最先存进去的肯定是一个元素
re[0]=hash_table[numbers[i]];
re[1]=i+1; //题目中输出案例,第一个元素是1
return re;
}
else{
//pair<int,int>newpair;
hash_table.insert(make_pair(target-numbers[i],i+1));
}
}
return re;
}
};
2、双指针法
因为数组是按序排的,已经排好序的数组,去查找两个数的和,应该要想到双指针啊。
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int p1=0,p2=numbers.size()-1;
vector<int>re(2);
while(p1<p2)
{
if(numbers[p1]+numbers[p2]>target)
{
p2--;
}
else if(numbers[p1]+numbers[p2]<target)
{
p1++;
}
else
{
re[0]=p1+1;
re[1]=p2+1;
return re;
}
}
return re;
}
};