题目描述:
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 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; } } } }泡泡:
嗯,没什么想说的了。