LeetCode 150: Two Sum II - Input Array Is Sorted

LeetCode 150: Two Sum II - Input Array Is Sorted

·

2 min read

Link https://leetcode.com/problems/two-sum-ii-input-array-is-sorted.

Problem: Given a 1-indexed array of integers numbers that is already sorted in non-decreasing order, find two numbers such that they add up to a specific target number. Let these two numbers be numbers[index<sub>1</sub>] and numbers[index<sub>2</sub>] where 1 <= index<sub>1</sub> < index<sub>2</sub> < numbers.length.

Return the indices of the two numbers, index<sub>1</sub> and index<sub>2</sub>, added by one as an integer array [index<sub>1</sub>, index<sub>2</sub>] of length 2.

The tests are generated such that there is exactly one solution. You may not use the same element twice.

Your solution must use only constant extra space.

Example 1:

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. We return [1, 2].

Example 2:

Input: numbers = [2,3,4], target = 6
Output: [1,3]
Explanation: The sum of 2 and 4 is 6. Therefore index1 = 1, index2 = 3. We return [1, 3].

Example 3:

Input: numbers = [-1,0], target = -1
Output: [1,2]
Explanation: The sum of -1 and 0 is -1. Therefore index1 = 1, index2 = 2. We return [1, 2].

This problem is not too difficult for entry-level if you understand clearly about loop. I will provide 2 solution.

Solution 1: Using loop.

We use two loop to loop through the array. If we find a pair of numbers whose sum equal to target number, we will return (indexOf + 1) of that pair number

let twoSum = function(numbers, target) {
    for (let i = 0;i < numbers.length; i++) {
        for (let j = 0; j < numbers.length; j++) {
            if (numbers[j] + numbers[i] === target) return [i+1;j+1]; 
        }
    }
}

Solution 2: Using two pointer.

We start by declare two variable.

Variable left with init value is 0, and right with init value is numbers.length -1.

Create a while loop. If numbers[left] + numbers[right] are smaller than the target then left increases.

if numbers[left] + numbers[right] greater than target then right decrease.

if numbers[left] + numbers[right] equal to target return [left+1, right+1];

let twoSum = function(numbers, target) {
    let l=0; r=numbers.length-1;
    while (l<r) {
        if(numbers[l] + numbers[r] < target) l++;
        else if (numbers[l] + numbers[r] > target) r--;
        else return [l+1, r+1];
    }
}