在做题中学习(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;
    }
};
相关推荐
AI科技星15 小时前
统一场论理论下理解物体在不同运动状态的本质
人工智能·线性代数·算法·机器学习·概率论
txinyu的博客15 小时前
sprintf & snprintf
linux·运维·算法
佳哥的技术分享15 小时前
Function<T, R> 中 apply,compose, andThen 方法总结
java·学习·r语言
pas13615 小时前
34-mini-vue 更新element的children-双端对比diff算法
javascript·vue.js·算法
Qhumaing15 小时前
数据结构——例子求算法时间复杂度&&空间复杂度
数据结构·算法
Yu_Lijing15 小时前
基于C++的《Head First设计模式》笔记——状态模式
c++·笔记·设计模式
阳明Coding15 小时前
golang从入门到通天—数据库操作(gorm框架使用)(最简单最详细的golang学习笔记)
笔记·学习·golang
鱼跃鹰飞15 小时前
Leetcode1027:最长等差数列
java·数据结构·算法
翱翔的苍鹰15 小时前
CIFAR-10 是一个经典的小型彩色图像分类数据集,广泛用于深度学习入门、模型验证和算法研究
深度学习·算法·分类
顶点多余15 小时前
静态链接 vs 动态链接,静态库 vs 动态库
linux·c++·算法