在做题中学习(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;
    }
};
相关推荐
t***54413 小时前
Clang 编译器在 Orwell Dev-C++ 中的局限性
开发语言·c++
Tutankaaa13 小时前
从被动接受到主动挑战:知识竞赛如何重塑学习价值
人工智能·经验分享·笔记·学习
房开民13 小时前
modbus相关学习
网络·学习
kobesdu13 小时前
人形机器人SLAM:技术挑战、算法综述与开源方案
算法·机器人·人形机器人
yolo_guo14 小时前
redis++使用: hmset 与 hmget
c++·redis
STC_USB_CAN_805114 小时前
菜单学习,科学计算器使用【TFT240*320彩屏+实际键盘】@Ai8051U,ST7789
单片机·学习·51单片机
handler0115 小时前
拒绝权限报错!三分钟掌握 Linux 权限管理
linux·c语言·c++·笔记·学习
xiaotao13115 小时前
02-机器学习基础: 无监督学习——scikit-learn实战与模型管理
学习·机器学习·scikit-learn
椰羊~王小美15 小时前
随机数概念及算法
算法
阿Y加油吧15 小时前
算法实战笔记:LeetCode 169 多数元素 & 75 颜色分类
笔记·算法·leetcode