Egbert Lin's Blog

“Life is not a race, but a journey to be savoured each step of the way” by Brian Dyson

[LeetCode Road] Two Sum II - Input array is sorted - Solution/C++

Two Sum II - Input array is sorted

Question:

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2.

Note:
  • Your returned answers (both index1 and index2) are not zero-based.
  • You may assume that each input would have exactly one solution and you may not use the same element twice.
  • Example:

    Input: numbers = [2,7,11,15], target = 9
    Output: [1,2]
    Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2.

    Input: numbers = [2,3,4], target = 6
    Output: [1,3]

    Input: numbers = [-1,0], target = -1
    Output: [1,2]

    Constraints:
  • 2 <= nums.length <= 3 * 10^4
  • -1000 <= nums[i] <= 1000
  • nums is sorted in increasing order.
  • -1000 <= target <= 1000
  • Source code

    Version 1

    Idea:
    The question is similar with Two Sum, you can use Hash Table to solve it. However, the input is sorted in ascending order, maybe you should try another method.

    For saving the memory, you can assume the first element as head, the last element as tail, so those formats will be an output. The illustration is shown at the end.

    A easy way to take the sum of head and tail to compare with target.

    • If the sum is bigger than target, tail minus 1
    • If the sum is smaller than target, head plus 1

    Finally, you will find the answer!

    (a.) Figure of input=[1,2,3, 5, 8, ..., 23,24] & target=22


    Time complexity: O(n)
    Space complexity: O(1)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution {
    public:
    vector<int> twoSum(vector<int>& numbers, int target) {
    vector<int> res;
    int head = 0, tail = numbers.size() - 1;
    while(true){
    if(numbers[head] + numbers[tail] == target) break;

    if(numbers[head] + numbers[tail] > target){
    tail --;
    }else if(numbers[head] + numbers[tail] < target){
    head ++;
    }
    }
    res.push_back(head + 1);
    res.push_back(tail + 1);
    return res;
    }
    };