思路
刚开始自己的想法,对数组进行遍历,取第一个数时,通过二分法来找target-nums[i]
,但发现最终这样的代码超时,时间复杂度O(nlogn)
改进的想法
使用双指针法,左指针指向最小元素,右指针指向最大元素,
比较两个指针所指元素的和与target
的大小,如果相等,则说明找到,如果sum>target
,则左指针++,反之,右指针++
代码
正确解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
int sum = 0;
int left = 0, right = nums.size()-1;
while (left<right)
{
sum = nums[left] + nums[right];
if (sum==target)
{
ans.push_back(nums[left]);
ans.push_back(nums[right]);
break;
}
if (sum > target) right--;
else left++;
}
return ans;
}
};
超时解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans(2);
for (int i=0;i<nums.size();i++)
{
ans.push_back(nums[i]);
if (binarySearch(nums, target - nums[i])) {
ans.push_back(target - nums[i]);
return ans;
}
ans.pop_back();
}
return ans;
}
bool binarySearch(vector<int> nums, int t)
{
int left = 0;
int right = nums.size() - 1;
while (left<=right)
{
int mid = left + (right - left) / 2;
if (nums[mid] == t) return true;
else if (nums[mid] > t) {//向左找
right = mid - 1;
}else if (nums[mid]<t)//向右找
{
left = mid + 1;
}
}
return false;
}
};