Binary Search
LeetCode 792 | Difficulty: Easyβ
EasyProblem Descriptionβ
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.
Topics: Array, Binary Search
Approachβ
Binary Searchβ
Binary search reduces the search space by half at each step. The key insight is identifying the monotonic property β what condition lets you decide to go left or right?
When to use
Sorted array, or searching for a value in a monotonic function/space.
Solutionsβ
Solution 1: C# (Best: 154 ms)β
| Metric | Value |
|---|---|
| Runtime | 154 ms |
| Memory | 40.2 MB |
| Date | 2021-11-25 |
Solution
public class Solution {
public int Search(int[] nums, int target) {
int lo = 0, hi = nums.Length - 1;
while(lo <= hi)
{
int mid = lo + (hi-lo)/2;
if(nums[mid] == target)
{
return mid;
}
else if(target > nums[mid])
{
lo = mid+1;
}
else
{
hi = mid-1;
}
}
return -1;
}
}
Complexity Analysisβ
| Approach | Time | Space |
|---|---|---|
| Binary Search | $O(log n)$ | $O(1)$ |
Interview Tipsβ
Key Points
- Start by clarifying edge cases: empty input, single element, all duplicates.
- Precisely define what the left and right boundaries represent, and the loop invariant.