解題思路
自己開始的思路是,對另一個數,在已有的數組中進行二分查找,而不是簡單的遍歷,自己覺得複雜度挺小的O(nlogn),但是一直超時,同時自己的代碼考慮了一種情況[2,7,7,10,11],target=9,如果是官方題解應該是返回值時{1,3};而我覺得正確的情況是[1,2](我寫的代碼可以獲得該結果),因此從官方題解可以看出沒有這種情況出現。代碼見後
之後參考自LeetCode官方提解
使用兩個指針,初始分別位於第一個元素和最後一個元素位置,比較這兩個元素之和與目標值的大小。
如果和等於目標值,我們發現了這個唯一解。
如果比目標值小,我們將較小元素指針增加一。
如果比目標值大,將較大指針減小一。移動指針後重覆上述比較直到找到答案。
時間複雜度O(n),空間複雜度O(1)
代碼
雙指針法
//雙指針
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int low = 0, high = numbers.size() - 1;//low低指針,high高指針
while (low < high)
{
int sum = numbers[low] + numbers[high];
if (sum == target) return { low + 1,high + 1 };//學到了
else if (sum < target)
{
low++;
}
else if (sum > target)
{
high--;
}
}
return { -1,-1 };//學到了
}
};
自己的想法
//下列算法,超時無法通過題目
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int> res;
for (int i=0;i<numbers.size();i++)
{
res.push_back(i+1);
int index = binarySearch(i+1, numbers, target - numbers[i]);
if (index != -1)
{
res.push_back(index+1);
return res;
}
res.pop_back();
}
return res;
}
//尋找左側邊界的二分搜索
int binarySearch(int i,vector<int> numbers,int target)
{
int left = i;
int right = numbers.size();
while (left<right) {
int mid = left + (right - left) / 2;
if (numbers[mid] == target) right=mid;
else if (numbers[mid] < target) {
left = mid + 1;
}
else if (numbers[mid]>target)
{
right = mid;
}
}
if (left == numbers.size()) return -1;
return numbers[left]==target?left:-1;
}
};