Start learning free

LESSON 267 OF 409 · BINARY SEARCH

Binary Search

Lesson O(log n) Read the full explanation

In this video lesson we will learn about the concept of searching, linear searching and more important - Binary Searching:


Problem:

Given a sorted array of integers nums, use Binary Search to find and return the index of a given value.

If the value doesn't exist in nums, return -1.


Example 1:

Input: nums = [1, 2, 4, 5], value = 4
Output: 2
Explanation: the element at index 2 is 4

Note:

Your algorithm should run in O(log n) time and use O(1) extra space.


STEP 1 OF 7
    Ctrl + Enter to check

    C++ · BINARY SEARCH

    Binary Search in C++, explained

    Introduction

    Binary Search is a fundamental algorithm in computer science used to find the position of a target value within a sorted array. It is highly efficient with a time complexity of O(log n), making it significantly faster than linear search for large datasets. Binary Search is widely used in various applications such as searching in databases, libraries, and even in competitive programming.

    Understanding the Basics

    Binary Search works by repeatedly dividing the search interval in half. If the value of the search key is less than the item in the middle of the interval, the algorithm narrows the interval to the lower half. Otherwise, it narrows it to the upper half. This process continues until the value is found or the interval is empty.

    For example, consider the sorted array [1, 2, 4, 5] and the target value 4. The algorithm will start by comparing 4 with the middle element 2. Since 4 is greater than 2, it will then compare 4 with the middle element of the upper half, which is 4. The target value is found at index 2.

    Main Concepts

    The key concepts in Binary Search include:

    • Midpoint Calculation: Calculate the middle index of the current interval.
    • Comparison: Compare the target value with the middle element.
    • Interval Adjustment: Adjust the search interval based on the comparison result.

    Here is the logical flow of the Binary Search algorithm:

    1. Initialize two pointers, left and right, to the start and end of the array, respectively.
    2. While left is less than or equal to right:
      • Calculate the midpoint mid.
      • If the target value is equal to nums[mid], return mid.
      • If the target value is less than nums[mid], adjust the right pointer to mid - 1.
      • If the target value is greater than nums[mid], adjust the left pointer to mid + 1.
    3. If the target value is not found, return -1.

    Examples and Use Cases

    Let's look at some examples to understand how Binary Search works in different scenarios:

    Example 1:

    Input: nums = [1, 2, 4, 5], value = 4
    Output: 2
    Explanation: nums[2] is 4

    Example 2:

    Input: nums = [1, 2, 4, 5], value = 3
    Output: -1
    Explanation: 3 is not in the array

    Binary Search is particularly useful in scenarios where you need to perform multiple search operations on a large, sorted dataset, such as in databases or search engines.

    Common Pitfalls and Best Practices

    When implementing Binary Search, avoid these common mistakes:

    • Incorrect midpoint calculation, which can lead to infinite loops or incorrect results.
    • Not updating the search interval correctly, causing the algorithm to miss the target value.

    Best practices for Binary Search include:

    • Ensure the array is sorted before performing Binary Search.
    • Use integer division to calculate the midpoint to avoid overflow issues.
    • Write clear and concise code with proper comments to enhance readability and maintainability.

    Advanced Techniques

    Advanced techniques related to Binary Search include:

    • Binary Search on Answer: Used in optimization problems where you need to find the minimum or maximum feasible solution.
    • Rotated Sorted Array Search: A variation of Binary Search used to find an element in a rotated sorted array.

    These techniques are useful in more complex scenarios and can be combined with the basic Binary Search algorithm to solve advanced problems.

    Code Implementation

    Here is a C++ implementation of the Binary Search algorithm:

    #include <iostream>
    #include <vector>
    
    int binarySearch(const std::vector<int>& nums, int value) {
        int left = 0;
        int right = nums.size() - 1;
        
        while (left <= right) {
            int mid = left + (right - left) / 2; // Calculate the midpoint
            
            // Check if the value is present at mid
            if (nums[mid] == value) {
                return mid;
            }
            
            // If value is greater, ignore the left half
            if (nums[mid] < value) {
                left = mid + 1;
            }
            // If value is smaller, ignore the right half
            else {
                right = mid - 1;
            }
        }
        
        // Value is not present in the array
        return -1;
    }
    
    int main() {
        std::vector<int> nums = {1, 2, 4, 5};
        int value = 4;
        int result = binarySearch(nums, value);
        
        if (result != -1) {
            std::cout << "Element found at index " << result << std::endl;
        } else {
            std::cout << "Element not found" << std::endl;
        }
        
        return 0;
    }
    

    This code demonstrates the Binary Search algorithm in C++. The function binarySearch takes a sorted array nums and a target value value as input and returns the index of the target value if it exists, or -1 if it does not.

    Debugging and Testing

    When debugging Binary Search, consider the following tips:

    • Print the values of left, right, and mid at each step to trace the algorithm's execution.
    • Check edge cases such as an empty array, a single-element array, and the target value being the first or last element.

    To test the Binary Search function, write test cases that cover various scenarios, including:

    • Target value present in the array.
    • Target value not present in the array.
    • Array with duplicate elements.

    Thinking and Problem-Solving Tips

    When approaching problems related to Binary Search, consider the following strategies:

    • Understand the problem requirements and constraints thoroughly.
    • Break down the problem into smaller parts and solve each part step-by-step.
    • Practice solving Binary Search problems on coding challenge platforms to improve your skills.

    Conclusion

    Binary Search is a powerful algorithm that offers efficient search capabilities for sorted arrays. Mastering Binary Search and its variations can significantly enhance your problem-solving skills and improve your performance in coding interviews and competitive programming. Practice regularly and explore advanced techniques to become proficient in Binary Search.

    Additional Resources

    For further reading and practice problems related to Binary Search, consider the following resources:

    Keep going with C++About 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free