在做题中学习(48):朴素的二分查找

. - 力扣(LeetCode)

解法一: 暴力求解

for循环中,从nums[0]枚举到nums[n-1],依次判断,返回 == target的值。

时间复杂度 : O(N) :因为要遍历一遍数组

解法二:二分查找

因为此数组为有序的数组,所以可以每次取数组中心元素来比较,<target就往右移动,>target就往左移动,之后由新的left right更新mid,若mid所在位置的值 == target 则返回mid 下标

1.mid < target left++

2.mid > target right--

3.mid == target return mid;

时间复杂度:O(logN)

细节问题:

1. 求中间元素

(left + right) /2 这种求法又可能会溢出(如果left + right足够大的话),因此建议用下面的求法:

left + (right - left) /2 又可能会见到 left + (right - left + 1) /2

两种的区别是:当元素数量为偶数时,会指向不同的值。

cpp 复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) 
    {
        int left = 0,right = nums.size()-1;
        while(left<=right)
        {
            int mid = left + (right - left) /2;
            if(nums[mid] < target)
                left = mid + 1;
            else if(nums[mid] > target)
                right = mid - 1;
            else 
                return mid;
        }
        return -1;
    }
};
相关推荐
pixcarp20 小时前
Golang web工作原理详解
开发语言·后端·学习·http·golang·web
青衫码上行20 小时前
SpringBoot多环境配置
java·spring boot·后端·学习
明洞日记20 小时前
【软考每日一练007】位图计算与内存管理深度全解
c++·算法·ai·操作系统·进程
敲敲了个代码20 小时前
前端指纹技术是如何实现的?(Canvas、Audio、硬件API 核心原理解密)
前端·javascript·学习·算法·面试·web
学编程就要猛20 小时前
算法:5.在排序数组中查找元素的第⼀个和最后⼀个位置
算法
张张努力变强20 小时前
C++ 类和对象(二):实例化、this指针、构造函数、析构函数详解
开发语言·c++
夏鹏今天学习了吗20 小时前
【LeetCode热题100(84/100)】乘积最大子数组
算法·leetcode·职场和发展
量子炒饭大师20 小时前
【C++入门】骇客数据面向对象的灵魂锚点——【类与对象】this指针篇
java·c++·dubbo·this·this指针
Yupureki21 小时前
《算法竞赛从入门到国奖》算法基础:入门篇-递归初阶
c语言·开发语言·数据结构·c++·算法·visual studio
a35354138221 小时前
牛顿迭代法中的雅克比矩阵几何意义
线性代数·算法