首页 > 编程语言 >算法->二分查找

算法->二分查找

时间:2024-10-17 12:09:54浏览次数:6  
标签:二分 right target nums int vector 算法 查找 left

二分查找

  1. >=target的第一个位置
  2. <=target的最后一个位置
class Solution {
public:
    //找>=target的第一个位置
    int binarySearchLeft(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) {
                right = mid - 1;//意味着索引>=right+1的数组值均>=target
            }
            else {
                left = mid + 1;//意味着索引<=left-1的数组值均<target
            }
        }
        return left;//左闭右闭区间退出循环,有left=right+1
    }
    //找<=target的最后一个位置
    int binarySearchRight(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;//意味着索引<=left-1的数组值均<=target
            }
            else {
                right = mid - 1;//意味着索引>=right+1的数组值均>target
            }

        }
        return right;//左闭右闭区间退出循环,有left=right+1
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftIdx = binarySearchLeft(nums, target);
        int rightIdx = binarySearchRight(nums, target);
        if (leftIdx <= rightIdx && rightIdx < nums.size() && nums[leftIdx] == target && nums[rightIdx] == target) {
            return vector<int>{leftIdx, rightIdx};
        }
        return vector<int>{-1, -1};
    }
};

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

标签:二分,right,target,nums,int,vector,算法,查找,left
From: https://www.cnblogs.com/milkchocolateicecream/p/18471804

相关文章

  • 算法(第4版)练习题 3.3.20 的一种解法
    本文给出了对于《算法(第4版)》(以下简称原书或书)中的练习题3.3.20的一种解法。◆要求原书中的练习题3.3.20要求计算一棵大小为N且完美平衡的二叉查找树的内部路径长度,其中N为2的幂减1。◆解答N为2的幂减1的一颗完美平衡的二叉查找树是一棵满二叉树。在这样的......
  • 时间复杂度为 O(n^2) 的排序算法
    作者:京东保险王奕龙对于小规模数据,我们可以选用时间复杂度为O(n2)的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下,O(n2)的排序算法可能会比O(nlogn)的排序算法执行效率高。不过随着数据规模增大,......
  • 算法与数据结构——堆排序
    堆排序堆排序(heapsort)是一种基于堆数据结构实现的高效排序算法。我们可以利用已经学过的“建堆操作”和“元素出堆操作”实现堆排序。输入数组并建立小顶堆,此时最小元素位于堆顶。不断执行出堆操作,依次记录出堆元素,即可得到从小到大排序的序列。以上方法虽然可行,但需借助一......
  • go 基于推特雪花算法生成定长id
    基于推特雪花算法生成定长id,属于int64类型。1BitUnused|41BitTimestamp|10BitNodeID|12BitSequenceID1bit未使用,默认是0。41bit存储毫秒级时间戳,当前时间与Nov04201001:42:54UTC的时间差。10bit存储节点的id,最多支持1024个。12bit自增id,同1个节点在1秒内最多......
  • 206号资源-源程序:2024年新智能优化算法-鹦鹉优化算法---------已提供下载资源
    ......
  • 数模创新算法篇 | 基于CEEMDAN分解与LSTM模型的电力负荷预测
    目录 废话不多说,直接上目录问题背景与理论1.长短期记忆网络(LSTM)理论2.CEEMDAN分解理论3.LSTM与CEEMDAN结合的优势4.应用场景与前景Python代码实操导入库和准备数据备注定义数据整理函数定义LSTM模型构建函数数据处理和模型训练评估模型性能绘制预测结果图......
  • 必学的排序算法——冒泡排序
    目录前言一、什么是冒泡排序二、冒泡排序的的基本步骤三、冒泡排序的特点四、冒泡排序算法图解五、经典例题1.合并两个有序数组代码题解2.元素计数代码题解3.最后一块石头的重量代码题解六、结语前言冒泡排序算法是必须掌握的一种基础算法,在一些比较出名的竞赛可......
  • C++算法练习-day1——704.二分查找
    题目来源:.-力扣(LeetCode)题目思路分析二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从......
  • 路径规划——RRT、RRT*、RRT-Connect算法说明
    1.RRT伪代码RRT的目标是在状态空间中随机采样并扩展树结构,直到找到连接起点和终点的路径。RRT(Rapidly-exploringRandomTree,快速随机扩展树)是一种用于解决运动规划问题的采样算法。它通过随机采样的方式,逐步构建一棵树,直到找到一条从起始状态到目标状态的路径。RRT算法的......
  • 机器学习篇-day08-聚类Kmeans算法
    一.聚类算法简介概念无监督学习算法根据样本之间的相似性,将样本划分到不同的类别中;不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。聚类算法的目的是在没有先验知识的情况下,自动发现数据集中的内在结构和模式。使用不同的聚类准则,产生的......