在做题中学习(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;
    }
};
相关推荐
youngee11几秒前
hot100-63买卖股票的最佳时机
数据结构·算法·leetcode
Swift社区4 分钟前
LeetCode 464 我能赢吗
算法·leetcode·深度优先
QK_006 分钟前
STM--32PWM动态输出
算法
爱吃生蚝的于勒8 分钟前
【Linux】零基础深入学习动静态库+深入学习地址
linux·运维·服务器·c语言·数据结构·c++·学习
2401_8414956412 分钟前
【机器学习】生成对抗网络(GAN)
人工智能·python·深度学习·神经网络·算法·机器学习·生成对抗网络
POLITE316 分钟前
Leetcode 560. 和为 K 的子数组 JavaScript (Day 5)
javascript·算法·leetcode
_OP_CHEN20 分钟前
【从零开始的Qt开发指南】(十四)Qt 窗口之“三剑客”:工具栏、状态栏、浮动窗口进阶实战指南
开发语言·c++·qt·前端开发·gui开发·qt窗口
Noushiki22 分钟前
RabbitMQ 基础 学习笔记1
笔记·学习·rabbitmq
知识分享小能手23 分钟前
Ubuntu入门学习教程,从入门到精通, Ubuntu 22.04中的任务计划详解(16)
linux·学习·ubuntu
我命由我1234535 分钟前
Photoshop - Photoshop 工具栏(53)画板工具
笔记·学习·职场和发展·求职招聘·职场发展·学习方法·photoshop