参考链接:http://www.cyc2018.xyz/%E7%AE%97%E6%B3%95/Leetcode%20%E9%A2%98%E8%A7%A3/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E5%8F%8C%E6%8C%87%E9%92%88.html#_1-%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84-two-sum
167.两数之和
给定一个已按照 非递减顺序排列??的整数数组?numbers ,请你从数组中找出两个数满足相加之和等于目标数?target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
题目描述:在有序数组中找出两个数,使它们的和为 target。
查看题解后 我重新写的代码如下
class Solution {
public int[] twoSum(int[] numbers, int target) {
if(numbers==null) return null;//先讨论特殊情况
int i=0,j=numbers.length-1;//双指针一头一尾
int sum=0;
while(true){
sum=numbers[i]+numbers[j];
if(sum<target) i++;//和小于预期,则小的指针往右移动
if(sum>target) j--;//和大于预期,则大的指针往左移动
if(sum==target) return new int[]{i+1,j+1};
if(i==j) return null;
}
}
}
题解如下
public int[] twoSum(int[] numbers, int target) {
if (numbers == null) return null;
int i = 0, j = numbers.length - 1;
while (i < j) {//此处循环条件采用i<j,比我的简洁
int sum = numbers[i] + numbers[j];
if (sum == target) {//先考虑相等的情况,如果相等就不用进行后面的步骤了
return new int[]{i + 1, j + 1};
} else if (sum < target) {
i++;
} else {
j--;
}
}
return null;
}
|