704. Binary Search

🟩 Easy

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.

You must write an algorithm with O(log n) runtime complexity.

Example 1

Input: nums = [-1,0,3,5,9,12], target = 9 Output: 4 Explanation: 9 exists in nums and its index is 4

Example 2

Input: nums = [-1,0,3,5,9,12], target = 2 Output: -1 Explanation: 2 does not exist in nums so return -1

Constraints

  • 1 <= nums.length <= 10^4

  • -10^4 < nums[i], target < 10^4

  • All the integers in nums are unique.

  • nums is sorted in ascending order.

Solution

My Solution

func search(nums []int, target int) int {
    l, r := 0, len(nums)-1
    for l <= r {
        mid := l+(r-l) / 2
        if nums[mid] == target {
            return mid
        } else if nums[mid] < target {
            l = mid+1
        } else {
            r = mid - 1
        }
    }

    return -1
}

Optimal Solution (Binary Search)

func search(nums []int, target int) int {
    left, right := 0, len(nums)-1
    
    for left <= right {
        mid := left + (right-left)/2  // Prevents integer overflow
        
        switch {
        case nums[mid] == target:
            return mid
        case nums[mid] < target:
            left = mid + 1
        default:
            right = mid - 1
        }
    }
    
    return -1
}

Approach

Binary Search is an efficient algorithm for searching in a sorted array:

  1. Initialize pointers:

    • Left pointer at start (index 0)

    • Right pointer at end (index n-1)

  2. While left ≤ right:

    • Calculate middle point: mid = left + (right-left)/2

    • Using (right-left)/2 instead of (left+right)/2 prevents integer overflow

  3. Compare middle element with target:

    • If equal: found target, return index

    • If target > middle: search right half (left = mid+1)

    • If target < middle: search left half (right = mid-1)

  4. If loop ends without finding target:

    • Return -1 (target not found)

Complexity Analysis

Time Complexity: O(log n)

  • Each iteration eliminates half of the remaining elements

  • The search space is halved in each step

  • Takes logâ‚‚(n) steps to reduce n elements to 1

Space Complexity: O(1)

  • Only uses three variables regardless of input size:

    • left - left pointer

    • right - right pointer

    • mid - middle index

Why it works

  • Takes advantage of the sorted nature of the array

  • Efficiently eliminates half of the remaining elements in each step

  • Using (right-left)/2 prevents integer overflow that could occur with (left+right)/2

  • The loop condition left <= right ensures we check all possible elements

result

Leetcode: link

Last updated

Was this helpful?