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

. - 力扣(LeetCode)

解法一: 暴力求解

for循环中,从nums0枚举到numsn-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;
    }
};
相关推荐
间歇性努力持续性发呆的野生快乐选手8 小时前
dfs回溯,bfs枚举,完全背包
c++·算法·深度优先·宽度优先
什仙9 小时前
Maxwell:提取实体表面,用于扫掠。
笔记·学习·ansys·maxwell
郝学胜_神的一滴9 小时前
干货版《算法导论》17:双数极值配对与卡牌手牌编码最优解
数据结构·算法
小僧景贤9 小时前
嵌入式C语言 第十一篇:成长路线|嵌入式C工程师完整进阶学习路径(从零到工程级落地|含周期+实战项目)
c语言·开发语言·学习
码工许师傅9 小时前
一文读懂《Effective C++ 第三版》的55条黄金法则
c++
有点。9 小时前
C++深度优先搜索(三)
开发语言·c++·深度优先
nike0good10 小时前
Codeforces Round 1101 (Div. 2) 题解
算法
中年阿甘10 小时前
解析式布局-二次线长布局
线性代数·算法·矩阵
程序喵大人10 小时前
【C++进阶】STL算法与函数对象 -【C++进阶】STL算法与函数对象
开发语言·c++·算法
我不会插花弄玉10 小时前
10.list【由浅入深-C++】
数据结构·c++·list