1 题目
题目:两数之和II-输入已排序的数组(Two Sum II - Input array is sorted)
描述:给定一个已经 按升序排列 的数组,找到两个数使他们加起来的和等于特定数。函数应该返回这两个数的下标,index1必须小于index2。注意返回的值不是 0-based。可以假设每个输入刚好只有一个答案
lintcode题号——608,难度——medium
样例1:
输入: nums = [2, 7, 11, 15], target = 9
输出: [1, 2]
样例2:
输入: nums = [2,3], target = 5
输出: [1, 2]
2 解决方案
2.1 思路
原数组已排好序,使用两个指针分别从头尾开始向中间走,若指针指向的两个值的和小于目标值,则左指针往右一步,若大于目标值,则右指针往左一步,直到找到结果。
2.2 时间复杂度
时间复杂度为O(n)。
2.3 空间复杂度
空间复杂度为O(1)。
3 源码
细节:
- 注意序号是基于1开始的,下标是基于0开始的,需要偏移一位。
C++版本:
/**
* @param nums: an array of Integer
* @param target: target = nums[index1] + nums[index2]
* @return: [index1 + 1, index2 + 1] (index1 < index2)
*/
vector<int> twoSum(vector<int> &nums, int target) {
// write your code here
vector<int> result;
if (nums.empty())
{
return result;
}
int left = 0;
int right = nums.size() - 1;
while (left < right)
{
if (nums.at(left) + nums.at(right) < target)
{
left++;
}
else if (nums.at(left) + nums.at(right) > target)
{
right--;
}
else
{
result.push_back(left + 1);
result.push_back(right + 1);
break;
}
}
return result;
}