Binary Search Problems

Binary Search in a Sorted Array

int binarySearch(vector& arr, int target) {
    int left = 0, right = arr.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) return mid;
        else if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}
            

Find First and Last Position of an Element in a Sorted Array

vector searchRange(vector& nums, int target) {
    vector result = {-1, -1};
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            result[0] = mid;
            result[1] = mid;
            while (result[0] > 0 && nums[result[0] - 1] == target) result[0]--;
            while (result[1] < nums.size() - 1 && nums[result[1] + 1] == target) result[1]++;
            break;
        } else if (nums[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return result;
}
            

Search a 2D Matrix

bool searchMatrix(vector>& matrix, int target) {
    int rows = matrix.size();
    int cols = matrix[0].size();
    int left = 0, right = rows * cols - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        int midVal = matrix[mid / cols][mid % cols];
        if (midVal == target) return true;
        else if (midVal < target) left = mid + 1;
        else right = mid - 1;
    }
    return false;
}
            

Find the Square Root of a Number

int mySqrt(int x) {
    long left = 0, right = x;
    while (left <= right) {
        long mid = left + (right - left) / 2;
        if (mid * mid == x) return mid;
        else if (mid * mid < x) left = mid + 1;
        else right = mid - 1;
    }
    return right;
}
            

Find the Peak Element in an Array

int findPeakElement(vector& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] > nums[mid + 1]) right = mid;
        else left = mid + 1;
    }
    return left;
}
            

Find the Minimum Element in a Rotated Sorted Array

int findMin(vector& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] > nums[right]) left = mid + 1;
        else right = mid;
    }
    return nums[left];
}
            

Find the Element in a Rotated Sorted Array

int search(vector& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) return mid;
        if (nums[left] <= nums[mid]) {
            if (nums[left] <= target && target < nums[mid]) right = mid - 1;
            else left = mid + 1;
        } else {
            if (nums[mid] < target && target <= nums[right]) left = mid + 1;
            else right = mid - 1;
        }
    }
    return -1;
}
            

Find the Number of Occurrences of an Element in a Sorted Array

int countOccurrences(vector& nums, int target) {
    int first = binarySearch(nums, target);
    if (first == -1) return 0;
    int last = binarySearch(nums, target);
    return last - first + 1;
}

int binarySearch(vector& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) return mid;
        else if (nums[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1;
}
            

Find the Kth Smallest Element in a Sorted Matrix

int kthSmallest(vector>& matrix, int k) {
    int n = matrix.size(), m = matrix[0].size();
    int left = matrix[0][0], right = matrix[n-1][m-1];
    while (left < right) {
        int mid = left + (right - left) / 2;
        int count = 0;
        for (int i = 0; i < n; i++) {
            count += upper_bound(matrix[i].begin(), matrix[i].end(), mid) - matrix[i].begin();
        }
        if (count < k) left = mid + 1;
        else right = mid;
    }
    return left;
}