Two Sum Using 2 pointer Java

 Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.


You may assume that each input would have exactly one solution, and you may not use the same element twice.


You can return the answer in any order.


 


Example 1:


Input: nums = [2,7,11,15], target = 9

Output: [0,1]

Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:


Input: nums = [3,2,4], target = 6

Output: [1,2]

Example 3:


Input: nums = [3,3], target = 6

Output: [0,1]


Follow-up: Can you come up with an algorithm that is less than O(n2) time complexity?

BruteForce :-


class Solution {
    public int[] twoSum(int[] nums, int target) {
       
        int n=nums.length;
int [] temp=new int [2];

for(int i=0;i<n;i++)
{
 
    for(int j=i+1;j<n;j++)
    {
        if(nums[i]+nums[j]==target)
        {
            temp[0]=i;
            temp[1]=j;
        }
    }
}
return temp;
    }
}

Optimal solution-n logn 

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int n = numbers.length;

        for (int i = 0; i < n - 1; i++) {
            int complement = target - numbers[i];
            int start = i + 1;
            int end = n - 1;

            while (start <= end) {
                int mid = start + (end - start) / 2;

                if (numbers[mid] == complement) {
                    return new int[]{i + 1, mid + 1}; // 1-based indexing
                } else if (numbers[mid] < complement) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }
            }
        }

        return new int[]{-1, -1}; // If no valid pair found
    }
}



Optimise: 2pointer (T.c -o(n)


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};
    }
}



Comments

Popular posts from this blog

Two Sum II - Input Array Is Sorted

Comparable Vs. Comparator in Java

Increasing Triplet Subsequence