--- title: '704. Binary Search' 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 sidebar: label: 'Binary Search' badge: 'Easy' --- Binary Search ::::warning 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. ## Approach ```mermaid flowchart TD S(["search(nums, target)"]) --> I["left = 0, right = n - 1"] I --> W{"left <= right?"} W -- no --> E(["return -1"]) W -- yes --> M["mid = left + floor((right - left) / 2)"] M --> Q{"nums[mid] vs target"} Q -- equal --> R(["return mid"]) Q -- "nums[mid] < target" --> L["left = mid + 1"] L --> W Q -- "nums[mid] > target" --> H["right = mid - 1"] H --> W ``` ## Solution ```js /** * @param {number[]} nums * @param {number} target * @return {number} */ var search = function(nums, target) { let left = 0; let right = nums.length - 1; while(left <= right) { const mid = left + Math.floor((right - left) / 2); if (nums[mid] === target) { return mid; } else if(nums[mid] < target){ left = mid + 1; } else if (nums[mid] > target) { right = mid - 1; } } return -1; }; ``` ## Explanation