problems:
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.
Example:
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.
tips;
简单题目,给定已升序排列的序列,找两个元素求和为指定的值,返回其位置.学习点在返回值的类型.
solutions:
1.暴力法寻找解:两个for循环
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
if(!n) return {0,0};
int idx1,idx2;
if(numbers[0] > target) return {0,0};
for(int i = 0;i < n;i++)
{
if(numbers[i] <= target )
{
idx1 = i+1;
for(int j = idx1;j < n;j++)
{
if(numbers[i] + numbers[j] == target)
{
idx2 = j + 1;
return {idx1,idx2};
}
else
if(numbers[j] > target)
{
idx2 = 0;
idx1 = 0;
break;
}
}
}
}
return {0,0};//为什么只能放在for循环的外面???
}
};
2.二分法求解:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
for(int i = 0;i < n;i++)
{
int left = i+1;
int right = n-1;
int t = target - numbers[i];
while(left <= right)
{
int mid = left + (right - left)/2;
if(t == numbers[mid]) return {i+1,mid+1};
else
if(t > numbers[mid]) left = mid+1;
else
right = mid-1;
}
}
return {0,0};
}
};
3.使用两个指针;
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
int i =0;
int j = n-1;
while(i < j)
{
int t = numbers[i] + numbers[j];
if(t == target) return {i+1,j+1};
else
if(t > target) j--;
else
i++;
}
return {0,0};
}
};