Two Sum II - Input Array Is Sorted

 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[index1] and numbers[index2] where 1 <= index1 < index2 <= numbers.length.


Return the indices of the two numbers, index1 and index2, added by one as an integer array [index1, index2] 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].

 


Constraints:


2 <= numbers.length <= 3 * 104

-1000 <= numbers[i] <= 1000

numbers is sorted in non-decreasing order.

-1000 <= target <= 1000

The tests are generated such that there is exactly one solution.


class Solution {
    public int[] twoSum(int[] numbers, int target) {
        // Initialize two pointers: one at the beginning, one at the end of the array
        int start = 0;
        int end = numbers.length - 1;

        // Loop until the two pointers meet
        while (start < end) {
            // Calculate the sum of the two current numbers
            int sum = numbers[start] + numbers[end];

            // If the sum matches the target, return the 1-based indices
            if (sum == target) {
                return new int[]{start + 1, end + 1};  // +1 for 1-based indexing
            }

            // If the sum is greater than the target, move the right pointer left to reduce the sum
            if (sum > target) {
                end--;
            }
            // If the sum is less than the target, move the left pointer right to increase the sum
            else {
                start++;
            }
        }

        // If no pair is found (though the problem guarantees one), return [-1, -1]
        return new int[]{-1, -1};
    }
}



2nd Approach:


if Array is Not Sorted, use HashMap (Leetcode 1)


import java.util.*;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            int rem = target - nums[i];

            if (map.containsKey(rem)) {
                return new int[] {map.get(rem), i};
            }

            map.put(nums[i], i);
        }

        return new int[0]; // if no result
    }
}


Comments

Popular posts from this blog

Comparable Vs. Comparator in Java

Increasing Triplet Subsequence