在做题中学习(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;
    }
};
相关推荐
2301_822366352 分钟前
C++中的协程编程
开发语言·c++·算法
m0_736919102 分钟前
C++中的事件驱动编程
开发语言·c++·算法
Rabbit_QL2 分钟前
【LLM原理学习】N-gram 语言模型实战教学指南(从原理到代码)
人工智能·学习·语言模型
嵌入小生0073 分钟前
数据结构基础内容 + 顺序表 + 单链表的学习---嵌入式入门---Linux
linux·数据结构·学习·算法·小白·嵌入式软件
宇钶宇夕4 分钟前
CoDeSys入门实战一起学习(二十六):功能块(FBD)运算块与EN/ENO指令精讲及计数控制案例
运维·学习·自动化·软件工程
xhbaitxl6 分钟前
算法学习day30-贪心算法
学习·算法·贪心算法
热爱编程的小刘7 分钟前
Lesson03---类与对象(中篇)
c++
会算数的⑨7 分钟前
Spring AI Alibaba学习(一)—— RAG
java·人工智能·后端·学习·spring·saa
小程同学>o<8 分钟前
嵌入式之C/C++(三)指针
c语言·c++·算法·嵌入式软件·嵌入式面试题库
正经人_x10 分钟前
学习日记30:N-BEATS
学习