题目:
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
思路:因为是有序数组,所以从传入数组的开头值left和结尾值right向中间靠拢,若和大于target,则right--,否则,left++,直到和等于target,时间复杂度为O(n)
代码如下:
public static int[] TwoSum(int[] numbers, int target)
{
int[] result = new int[2];
int left = 0, right = numbers.Length - 1;
while (left < right)
{
int temp = numbers[left] + numbers[right];
if (temp == target)
{
result[0] = left + 1;
result[1] = right + 1;
break;
}
if (temp > target)
right--;
else
left++;
}
return result;
}
Main方法:
static void Main(string[] args)
{
int[] numbers = new int[] { 2, 7, 11, 15 };
int[] result = TwoSum(numbers, 9);
for(int i=0;i<result.Length;i++)
{
Console.Write(result[i] + " ");
}
Console.ReadKey();
}
总结:这是两数之和的衍生题目,两数之和的方法也可以拿到这里用,不过因为提供的是有序数组,所以这个方法看起来更简洁,在网上看了一下,基本上都是用这个方法,若有其他方法,欢迎和我交流。