What if you could find a needle in a haystack by looking at only a few spots?
Why Binary Search as Divide and Conquer in DSA Typescript?
Imagine you have a huge phone book and you want to find a friend's number. You start from the first page and check every name one by one until you find it.
This manual way is very slow and tiring because you might have to look through thousands of pages. It wastes time and energy, especially if the book is very big.
Binary Search splits the phone book in half each time you look. You check the middle page, decide which half your friend's name is in, and then only search that half. This way, you quickly zoom in on the right page without checking every single one.
function findNumber(names: string[], target: string): number {
for (let i = 0; i < names.length; i++) {
if (names[i] === target) return i;
}
return -1;
}function binarySearch(names: string[], target: string): number {
let left = 0;
let right = names.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (names[mid] === target) return mid;
else if (names[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}It lets you find things super fast in big sorted lists by cutting the search space in half again and again.
When you search for a word in a dictionary app, it uses binary search to jump quickly to the right page instead of flipping through every word.
Manual search checks every item one by one, which is slow.
Binary Search divides the list to find the target faster.
This method works only if the list is sorted.
Practice
Binary Search as a divide and conquer algorithm?Solution
Step 1: Understand binary search principle
Binary search works by dividing the sorted list into two halves and deciding which half to continue searching in.Step 2: Compare target with middle element
By comparing the target with the middle element, we eliminate half the list each time, making search efficient.Final Answer:
Repeatedly split the sorted list into halves to find the target -> Option DQuick Check:
Divide and conquer = split list halves [OK]
- Thinking binary search works on unsorted lists
- Searching linearly instead of dividing
- Ignoring the middle element comparison
Solution
Step 1: Identify input and output types
Binary search takes an array of numbers and a target number, returning the index (number) or -1 if not found.Step 2: Match function signature
function binarySearch(arr: number[], target: number): number matches input types (number array and number) and returns a number index, which is correct.Final Answer:
function binarySearch(arr: number[], target: number): number -> Option AQuick Check:
Input: number[], number; Output: number [OK]
- Swapping array and target types
- Returning void instead of index
- Using wrong array element types
function binarySearch(arr: number[], target: number): number {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
const nums = [2, 4, 6, 8, 10];
console.log(binarySearch(nums, 6));Solution
Step 1: Identify array and target
Array is [2,4,6,8,10], target is 6.Step 2: Trace binary search steps
Middle index initially is 2 (value 6), which matches target, so function returns 2 immediately.Final Answer:
2 -> Option AQuick Check:
Index of 6 in array = 2 [OK]
- Confusing index with value
- Off-by-one errors in mid calculation
- Returning wrong index when target found
function binarySearch(arr: number[], target: number): number {
let left = 0;
let right = arr.length;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}Solution
Step 1: Check right boundary initialization
Right should be last valid index, which is arr.length - 1, not arr.length (out of bounds).Step 2: Understand impact on loop
Using arr.length causes mid to sometimes be out of array range, causing runtime errors.Final Answer:
Change right initialization to arr.length - 1 -> Option CQuick Check:
Right boundary = last index [OK]
- Setting right to arr.length causes out-of-bounds
- Changing loop condition incorrectly
- Miscalculating mid index
[1, 2, 2, 2, 3, 4]. How would you modify binary search to find the first occurrence of 2?Solution
Step 1: Understand duplicates in binary search
Standard binary search returns any matching index, not necessarily the first occurrence.Step 2: Modify search to find first occurrence
After finding target, continue searching left half to check if earlier occurrence exists, updating result accordingly.Final Answer:
After finding 2, continue searching left half to find earlier occurrence -> Option BQuick Check:
Find first occurrence by searching left side [OK]
- Stopping at first found index
- Searching right half after match
- Switching to linear search unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
