Leetcode之167-两数之和II(Two Sum II - Input array is sorted)

前言

个人网站

公众号: 北京程序猿, 网站 : 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/

    原文作者:北京程序猿
    原文地址: https://www.jianshu.com/p/f4174edf84cb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞