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
Post a Comment