Leetcode之167-两数之和II(Two Sum II -

作者: 北京程序猿 | 来源:发表于2019-03-24 12:43 被阅读0次

    前言

    个人网站

    公众号: 北京程序猿, 网站 : https://yaml.vip

    算法题

    题干

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

    说明

    1. 返回的下标值(index1 和 index2)不是从零开始的。
    2. 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

    示例

    输入: number = [2, 7, 11, 15], target = 9,输出: [1,2]
    解释: 2 与 7之和等于目标数 9 。因此 index1 = 1, index2 = 2

    解法

    1. 暴力破解
    2. 单指针+HashMap
    3. 前后两指针

    复杂度

    1. 时间复杂度O(N^2)
    2. 时间复杂度O(N), 空间复杂度O(N)
    3. 时间复杂度O(N)

    Java代码

    public static int[] twoSum(int[] array, int target) {
        if (array == null || array.length <= 1) {
            return new int[2];
        }
        final int length = array.length;
        int frontCursor = 0, backCursor = length - 1;
        while (frontCursor < backCursor) {
            int frontValue = array[frontCursor];
            int minusValue = target - array[backCursor];
            if (frontValue == minusValue) {
                return new int[]{frontCursor + 1, backCursor + 1};
            }
            if (frontValue < minusValue) {
                frontCursor++;
                continue;
            }
            backCursor--;
        }
        return new int[2];
    }
    

    思考题

    1. 第九行代码为何用减法?
    2. 题目中有几个限定条件,如果限定条件去掉,代码该如何写?
      • 答案不唯一?
      • 数字可以重复利用?
    3. 是否可以用二分法去解该算法题?

    本文著作权归作者所有。

    商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

    作者:北京程序猿

    链接:https://yaml.vip/2019/03/05/Leetcode%E4%B9%8B167-%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8CII/

    相关文章

      网友评论

        本文标题:Leetcode之167-两数之和II(Two Sum II -

        本文链接:https://www.haomeiwen.com/subject/pxquvqtx.html