在做题中学习(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;
    }
};
相关推荐
darkhorsefly7 分钟前
玩24算的益处
学习·游戏·24算
迈巴赫车主8 分钟前
蓝桥杯19724食堂
java·数据结构·算法·职场和发展·蓝桥杯
6Hzlia25 分钟前
【Hot 100 刷题计划】 LeetCode 78. 子集 | C++ 回溯算法题解
c++·算法·leetcode
Kethy__28 分钟前
计算机中级-数据库系统工程师-数据结构-查找算法
数据结构·算法·软考·查找算法·计算机中级
所以遗憾是什么呢?33 分钟前
【题解】Codeforces Round 1081 (Div. 2)
数据结构·c++·算法·acm·icpc·ccpc·xcpc
白藏y1 小时前
【C++】muduo接口补充
开发语言·c++·muduo
深蓝海拓2 小时前
S7-1500学习笔记:用户自定义数据类型(UDT)
笔记·学习·plc
xiaoye-duck2 小时前
《算法题讲解指南:递归,搜索与回溯算法--综合练习》--14.找出所有子集的异或总和再求和,15.全排列Ⅱ,16.电话号码的字母组合,17.括号生成
c++·算法·深度优先·回溯
OOJO2 小时前
c++---vector介绍
c语言·开发语言·数据结构·c++·算法·vim·visual studio
汀、人工智能2 小时前
05 - 函数基础
数据结构·算法·数据库架构·05 - 函数基础