https://leetcode.com/problems/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.
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 4Example 2:
Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1Constraints:
1 <= nums.length <= 104-104 < nums[i], target < 104- All the integers in
numsare unique. numsis sorted in ascending order.
class Solution {
public:
int search(vector<int>& nums, int target) {
int N=nums.size();
for(int left=0, right=N-1, mid=(right+left)>>1;left <= right;){
//loop util nums[mid]==target
//if len is 0 then break
if(target==nums[mid]){
return mid;
} else if(target<nums[mid]){
right=mid-1;
mid=(left+right)>>1;
}else{
left=mid+1;
mid=(left+right)>>1;
}
}
return -1;
}
};This problem is easy, but pay attention to mid=(left+right)>>1;
For this problem, 1<=nums.length<=104, so it should be fine. However, if the length is very large, then left+right may be overflow. To solve overflow, we use mid=left+((right-left)>>1); or mid = ((unsigned int)low + (unsigned int)high)) >> 1;
You can find more details on https://ai.googleblog.com/2006/06/extra-extra-read-all-about-it-nearly.html.