Question:
Similar to Question [1. Two Sum], except that the input array is already sorted in
ascending order.
solution1
使用两个下标,一个i=0,一个j=nums.size();从后往前计算
//做出来还是挺开心的,问题代码可太复杂了,答案是简化了一波,感觉很优秀了
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> map;
vector<int> ret;
int j = nums.size()-1;
int len = nums.size()%2;
if (len == 1)
len = nums.size() / 2 + 1;
else
len = nums.size() / 2;
for (int i = 0; i < len; i++)
{
while (nums[i] + nums[j] > target)
{
j--;
}
if (nums[i] + nums[j] == target)
{
//cout << i << " " << j << endl;
ret.push_back(i);
ret.push_back(j);
}
}
return ret;
}
//answer
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> ret;
int j = nums.size() - 1;
int i = 0;
while (i < j)
{
if (nums[i] + nums[j] == target)
{
//cout << i << " " << j << endl;
ret.push_back(i);
ret.push_back(j);
i++;
}
else if (nums[i] + nums[j] > target)
j--;
else
i++;
}
return ret;
}
solution 2
对于有序的数组,查找效率想要高一点,考虑二分查找。
// test1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
using namespace std;
int search(vector<int> nums, int i, int target);
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> ret;
for (int i = 0; i < nums.size() / 2; i++)
{
int tar = target - nums[i];
if (search(nums, i,tar) != -1&&search(nums,i,tar)>i)
{
cout << i << " " << tar << endl;
ret.push_back(i);
ret.push_back(search(nums, i,tar));
}
}
return ret;
}
int search(vector<int> nums, int i,int target)
{
int len = nums.size()-1;
while (i<len)
{
int mid = (len + i) / 2;
if (nums[mid] > target)
len = mid;
else
i = mid;
}
return (len = i && nums[len] == target) ? len : -1;
}
int main()
{
vector<int> nums = {2,3,3,4,5};
twoSum(nums, 7);
return 0;
}
又是开心的一天呢。