Leetcode双指针系列

参考链接: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;
}

上一篇:167. 两数之和 II - 输入有序数组(双指针)


下一篇:方法