The Binary Search problem requires finding the index of a target element in a sorted
array.
Here are two approaches:
Approach 1: Iterative Binary Search - Use two
pointers,
start and
end, to define the search
range.
Calculate the
mid point and compare nums[mid] with
the target. If nums[mid] == target,
return mid. If nums[mid]
> target,
adjust end to
mid - 1. If nums[mid] < target,
adjust start to mid + 1.
Approach 2: Recursive Binary Search - Define a helper function
binarySearch that takes start, end, and target as parameters. Calculate the
midpoint mid and compare nums[mid]
with the target. If nums[mid] == target, return mid. If
nums[mid] < target,
recursively search the right half. If nums[mid] > target, recursively search
the left half.
class Solution { public: int search(vector<int>& nums, int target) { int start = 0; int end = nums.size()-1; while(start<=end){ int mid = (start+end)/2; if(nums[mid]==target) return mid; if(nums[mid]>target) end = mid-1; else start = mid+1; } return -1; } };
class Solution { public: int binarySearch(vector<int> nums,int start, int end, int target){ int mid = (start+end)/2; if(start>end) return -1; if(nums[mid]==target) return mid; if(nums[mid]<target) return binarySearch(nums,mid+1,end,target); else return binarySearch(nums,start,mid-1,target); } int search(vector<int>& nums, int target) { int start = 0; int end = nums.size()-1; int idx = binarySearch(nums,start,end,target); return idx; } };
Both approaches halve the search space at each step, ensuring logarithmic time complexity.
The iterative approach uses constant extra space, while the recursive approach uses stack space proportional to the depth of recursion.