LeetCode 704.二分查找
LeetCode 704.二分查找
思路🧐:
在本篇以及之后几篇的博客中,博主将会用二分法进行解答,以此巩固二分题型。二分法一般用于具有二段性的数据中使用。比如该题为有序数组,需要我们查找一个目标值target,分析后发现,这段数据中会出现三种情况,大于target,小于target,等于target,而等于target是我们的目标,于是可以判断出,这个数组是具有二段性的,以target进行分段,由此得出使用二分法。
我们以下面数组进行举例,首先求出一个中间值,这里我使用left + (right - left) / 2求得中间值,在某些情况下,需要在right - left后面再加上1,否则会导致死循环,具体在之后的篇章中会进行说明。求出中间值nums[mid]=3后,此时target大于3,于是可以得出,[left,mid]之间的所有数据,都不可能含有9,则可以舍去这段区间,得到left = mid + 1,然后再次进行该过程。假如nums[mid] > target,则表示[mid,right]区间可以舍去,则right = mid - 1。当nums[mid] == target时,表示找到了目标值,即可返回。如果left > right,表示整个数组都找完了也没找到目标值,返回-1。
代码🔎:
class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while(left <= right) { int mid = left + (right - left) / 2; if(target > nums[mid]) left = mid + 1; else if(target < nums[mid]) right = mid - 1; else return mid; } return -1; } };
时间复杂度:O(LogN) 空间复杂度:O(1)