both 40ms 15/15
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
// assert(!numbers.empty());
vector<int> rst;
int l = 0, r = numbers.size() - 1;
int sum;
while (l < r) {
sum = numbers[l] + numbers[r];
if (sum > target) {
r--;
}
else if (sum < target) {
l++;
}
else {
rst.push_back(l+1);
rst.push_back(r+1);
return rst;
}
}
}
};
class Solution {
public:
vector<int> twoSum(vector<int> &numbers, int target) {
// assert(!numbers.empty());
vector<int> rst;
int left = 0, right = numbers.size() - 1;
while (left < right) {
int sum = numbers[left] + numbers[right];
//cout << "Sum: " << sum << endl;
if (sum == target) {
rst.push_back(left+1);
rst.push_back(right+1);
return rst;
}
else if (sum > target) {
right = findNum(numbers, target - numbers[left], left, right-1);
//cout << "right: " << right << endl;
}
else {
left = findNum(numbers, target - numbers[right], left+1, right);
//cout << "left: " << left << endl;
}
//cout << "++++++++++++++++" << endl;
}
return rst;
}
int findNum(vector<int> &numbers, int tar, int l, int r) {
int mid;
while (l < r) {
mid = l + (r - l) / 2;
if (numbers[mid] > tar)
r = mid - 1;
else if (numbers[mid] < tar)
l = mid + 1;
else
return mid;
}
return l;
}
};