两数之和 II --输入有序数组
题目描述:
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
问题分析:
在给出是有序数组的条件下,找出这个下标已经不是什么问题了,主要在于用什么方法更节省时间
第一种:双重循环
第二种:双指针
第三种:二分法
代码展示(已验证):
第一种:双重循环
// leetcode-java
class Solution {
public int[] twoSum(int[] numbers, int target) {
// 第一种方法:双重循环, 超时
int[] index = new int[2];
for(int i=0; i<numbers.length; i++)
if(i<= numbers.length-1)
for(int j=i+1; j<numbers.length; j++)
{
if(numbers[i]+numbers[j] == target)
{
index[0] = i+1;
index[1] = j+1;
return index;
}
}
return index;
第二种:双指针 ,利用已排序的特点进行求解
// 第二种:双指针 ,利用已排序的特点进行求解
int i = 0, j = numbers.length-1;
int[] ret = new int[2];
while(i < j)
{
int sum = numbers[i] + numbers[j];
if(sum < target)
{
i++;
}
else if(sum > target)
{
j--;
}
else
{
ret[0] = i+1;
ret[1] = j+1;
return ret;
}
}
return ret;
第三种:二分法
// 第三种:二分法,超时
int left=0,right = numbers.length-1;
int mid = left+right;
int[] index = new int[2];
while(true)
{
if(numbers[left]+numbers[right] == target)
{
index[0] = left+1;
index[1] = right+1;
return index;
}
else if(numbers[left]+numbers[right] >target)
{
right = mid;
mid = (left+right)/2;
}
else
{
left = mid;
mid = (left+right)/2;
}
}
}
}
泡泡:
嗯,没什么想说的了。