二分查找算法(1)

慈云数据 1年前 (2024-03-23) 技术支持 66 0

算法介绍

二分查找适用范围不止是有序数组,很多有“二段性”的数组其实都可以使用二分查找,什么是“二段性”呢?在数组中,我们查到某个数不符合条件后,就可以排除它之前或之后的所有数据,这种性质就叫做“二段性”!

我们的二分查找有三种情况:1.朴素的二分模板 2.查找左边界的二分模板 3.查找右边界的二分模板

这几种我们都会讲到!

704.二分查找

一、题目描述

OJ题目链接:力扣(LeetCode)

二、思路解析



三、代码

class Solution {
public:
    int search(vector& nums, int target) 
    {
        int left = 0, right = nums.size() - 1;
        while(left  nums[mid]) left = mid + 1;
            else right = mid - 1; 
        }
        return -1;
    }
};

34.在排序数组中查找元素的第一个和最后一个位置

一、题目描述

非递减顺序:两个相邻的数后面的大或者两数相等

时间复杂度O(logn)联想到二分查找!

二、思路解析




三、代码

class Solution {
public:
    vector searchRange(vector& nums, int target) 
    {
        if(!nums.size()) return {-1, -1};//处理边界情况
        int left = 0, right = nums.size() - 1;
        int begin = -1, end = -1;
        while (left = target) right = mid;
            else left = mid + 1;
        }
        //判断是否满足题意
        if(nums[left] == target) begin = left;
        left = 0, right = nums.size() - 1;
        while(left  target) right = mid - 1;
            else left = mid;
        }
        if(nums[right] == target) end = right;
        return {begin, end};
    }
};

35.搜索插入位置

一、题目描述

OJ题目链接:力扣(LeetCode)

二、思路解析

三、代码

class Solution {
public:
    int searchInsert(vector& nums, int target) 
    {
        int left = 0, right = nums.size() - 1;
        while (left = target) return left;
    return left + 1;
    }
};

69.x的平方根

一、题目描述

OJ题目链接:力扣(LeetCode)

二、思路解析

三、代码

class Solution {
public:
    int mySqrt(int x) 
    {
        if (x 
微信扫一扫加客服

微信扫一扫加客服