在做题中学习(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;
    }
};
相关推荐
念恒1230610 小时前
基础IO(文件缓冲区)
linux·c语言·c++
AKA__Zas10 小时前
芝士算法(双指针篇 1.0)
java·算法·学习方法
吃着火锅x唱着歌10 小时前
LeetCode 726.原子的数量
linux·算法·leetcode
君义_noip11 小时前
CSP-S 2025 提高级 第一轮(初赛) 阅读程序(3)
c++·算法·信息学奥赛·csp-s 初赛
玛卡巴卡ldf11 小时前
【LeetCode 手撕算法】(栈)有效括号、最小栈、字符串解码、每日温度、柱状图最大矩形
java·数据结构·算法·leetcode·力扣
程序员卷卷狗11 小时前
Claude Code工作原理学习笔记:从Agent Loop到工具调用
chrome·笔记·学习
happyprince11 小时前
05-FlagEmbedding 评估模块详解
算法
wuweijianlove11 小时前
算法优化的多目标平衡与性能建模研究的技术7
算法
汉克老师11 小时前
GESP6级C++考试语法知识(三、图与树(三))
c++·中序遍历·bst·完全二叉树·二叉排序树·gesp6级·gesp六级
_深海凉_11 小时前
LeetCode热题100-两两交换链表中的节点
算法·leetcode·链表