题解 | #二分查找-I#
二分查找-I
http://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b
题意整理:
题意已经非常明显,既书写一个对不存在重复元素的排序数组的二分查找
二分查找既利用数组排序特性的一种高效查找算法,一次可以去除一半的待查找元素,所以时间复杂度为
方法一:书写简单二分
核心思想:
采用双指针的方法,左指针开始时指向数组头部,右指针开始时指向数组尾部,每次都对两指针中间值与目标值对比,根据大小特性进行指针调整,当mid对应值等于目标值,返回答案;当mid对应值大于目标值,说明mid及其右侧元素不满足,令右指针指向mid左侧;同理当mid对应值小于目标值,令左指针指向mid右侧。当两根指针交错时,说明不存在目标元素。
核心代码:
class Solution { public: int search(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1, mid = 0; while(left <= right) { mid = (left + right) / 2;//取中间点 if(nums[mid] == target) { //找到了答案 return mid; } else if(nums[mid] > target) { //此时mid右侧元素不满足 right = mid - 1; } else { //此时mid左侧元素不满足 left = mid + 1; } } return -1; } };
复杂度分析:
时间复杂度:,每次都排除一半的元素,故复杂度为
空间复杂度:,只使用了常数个变量
方法二:使用STL提供的二分查找
核心思想:
STL提供了lower_bound()函数,当查找元素存在时,该函数返回其第一个出现的位置,否则返回其可以正确插入的位置。所以只需要对返回位置的值与目标值进行对比就可以确认目标值是否出现。
核心代码:
class Solution { public: int search(vector<int>& nums, int target) { if(nums.size() == 0) { return -1; } auto it = lower_bound(nums.begin(),nums.end(),target); if(*it != target){ //此时不存在元素,返回的是可以插入的位置 return -1; } return (it - nums.begin()); } };
复杂度分析:
时间复杂度:,该函数时间复杂度为
空间复杂度:,该函数空间复杂度为