题目
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
题解
- 我写的虽然速度也是100%,但是对比最佳案例来说,真的就只是个渣渣
- 简单说一下最佳案例的思路,既然是一个升序序列,
numbers[0]
+numbers[len-1]
就是最大的和,如果sum < target
那么最小的数就应该右移,反之,最大的数应该左移,直到满足条件。
代码
#include "../Jx_test.h"
//超过时间限制
//原因,升序排列,但是元素可能相同
vector<int> twoSum_Jx001(vector<int>& numbers, int target)
{
for (int i = 0; i < numbers.size() - 1; i++)
{
for (int j = 1; i + j < numbers.size(); j++)
{
int temp = numbers[i] + numbers[i + j];
if (temp == target)
{
return { i + 1, i + j + 1 };
}
else if (temp > target)
{
continue;
}
}
}
return { 0,0 };
}
//超过时间限制
vector<int> twoSum_Jx002(vector<int>& numbers, int target)
{
for (int i = 0; i < numbers.size() - 1; i++)
{
int temp = target - numbers[i];
if (temp > numbers[numbers.size() - 1])
{
continue;
}
for (int j = 1; i + j < numbers.size(); j++)
{
if (numbers[i + j]==temp)
{
return { i + 1, i + j + 1 };
}
else if (numbers[i + j] > temp)
{
continue;
}
}
}
return { 0,0 };
}
//time:0 ms //memory:9.4 MB //rank:100%
vector<int> twoSum_Jx003(vector<int>& numbers, int target)
{
int len = numbers.size(); //防止unsigned long
for (int i = 0; i < len - 2; i++)
{
if (numbers[i] == numbers[i + 2])
{
//答案是唯一的,
while (numbers[i] == numbers[i + 1])
{
i++;
}
continue;
}
int temp = target - numbers[i];
if (temp > numbers[len - 1])
{
continue;
}
for (int j = 1; i + j < len; j++)
{
if (numbers[i + j] == temp)
{
return { i + 1, i + j + 1 };
}
else if (numbers[i + j] > temp)
{
continue;
}
}
}
return { len - 1,len };
}
//最快案例 代码简洁
//思路无敌
vector<int> twoSum_Eg001(vector<int>& numbers, int target)
{
int n = numbers.size(); //记录长度
int low = 0, high = n - 1, sum;
while (low < high) {
sum = numbers[high] + numbers[low];
if (sum == target)
return { low + 1,high + 1 };
else if (sum < target)
low++;
else
high--;
}
return { -1,-1 };
}