lower_bound当target存在时, 返回它出现的第一个位置,如果不存在,则返回这样一个下标i:在此处插入target后,序列仍然有序。

代码如下:

int lower_bound(int* nums, int numsSize, int target) {
//注意left和right的初始值必须是left = 0, right = numsSzie, 因为插入的位置可能是[0,numsSize]
int left = 0;
int right = numsSize;
int mid;
while (left < right)
{
mid = left + (right - left) / 2;
if (nums[mid] >= target)
right = mid;
else
left = mid + 1;
} return left;
}

尽管查找区间是[0, numsSize),但返回值区间却是[0, numsSize]。因此right的初始值必须为numsSize,而不是numsSize - 1。

当nums[mid] == target时,至少已经找到了一个,而左边可能还有,因此区间变为[left, mid];

当nums[mid] > target时,所求位置不可能在后面,但有可能是mid,因此区间变为[left, mid];

当nums[mid] < target时,mid和前面都不可行,因此所求区间为[mid+1, right]。

合并一下,当nums[mid] >= target时,所求区间为[left, mid];当nums[mid] < target时,所求区间为[mid + 1, right]。

类似地,可以写一个upper_bound程序,当target存在时, 返回它出现的最后一个位置的后面一个位置,如果不存在,则返回这样一个下标i:在此处插入target后,序列仍然有序。

int upper_bound(int* nums, int numsSize, int target) {
//注意left和right的初始值必须是left = 0, right = numsSzie, 因为插入的位置可能是[0,numsSize]
int left = 0;
int right = numsSize;
int mid;
while (left < right)
{
mid = left + (right - left) / 2;
if (nums[mid] <= target)
left = mid + 1;
else
right = mid;
}
return left;
}

二分查找确定lower_bound和upper_bound的更多相关文章

  1. C++二分查找:lower_bound( )和upper_bound( )

    #include<algorithm>//头文件 //标准形式 lower_bound(int* first,int* last,val); upper_bound(int* first, ...

  2. 二分查找(lower_bound和upper_bound)

    转载自:https://www.cnblogs.com/luoxn28/p/5767571.html 1 二分查找 二分查找是一个基础的算法,也是面试中常考的一个知识点.二分查找就是将查找的键和子数组 ...

  3. 二分检索函数lower_bound()和upper_bound()

    二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...

  4. STL_算法_查找算法(lower_bound、upper_bound、equal_range)

    C++ Primer 学习中. .. 简单记录下我的学习过程 (代码为主) //全部容器适用(O(log(n)))    已序区间查找算法 lower_bound()        //找第一个符合的 ...

  5. 关于二分查找 使用 lower_bound

    在寻找单调递增最长自序列 , 的时候能不能确认出来哪个是单调递增最长自序列  ?  我的想法是 if(location>=num) dp[location]=b; 这样的 , 基于http:// ...

  6. LeetCode:Search Insert Position,Search for a Range (二分查找,lower_bound,upper_bound)

    Search Insert Position Given a sorted array and a target value, return the index if the target is fo ...

  7. 【CodeForces-1041C】Coffee Break(二分解决关于set,pair,upper_bound用法)

    //题意:一个的工作时间是m分钟. // 在特定的时间和咖啡 n a1,a2....an,, ai代表的是每个咖啡要在一天中对应的时间点喝掉 // 每一次喝咖啡的时间为1分钟 // 必须在一天中的ai ...

  8. I Count Two Three(打表+排序+二分查找)

    I Count Two Three 二分查找用lower_bound 这道题用cin,cout会超时... AC代码: /* */ # include <iostream> # inclu ...

  9. STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())

    一:起因 (1)STL中关于二分查找的函数有三个:lower_bound .upper_bound .binary_search  -- 这三个函数都运用于有序区间(当然这也是运用二分查找的前提),以 ...

随机推荐

  1. 尝试做一个.NET简单、高效、避免OOM的Excel工具

    Github : https://github.com/shps951023/MiniExcel 简介 我尝试做一个.NET简单.高效.避免OOM的Excel工具 目前主流框架大多将资料全载入到记忆体 ...

  2. macbook/macOS下打开多个相同应用(应用多开)

    1.部分应用可使用common+n快捷键.如qq:打开qq主界面后使用common+n即可新起一个qq程序. 2.在终端使用命令 open -n +程序路径.如启动多个qq :  open -n /A ...

  3. HMS Toolkit助力开发者高效集成HMS Core

    当你的应用想集成华为HMS Core服务和上线华为应用市场,或当你已经开发了一个Android应用并集成了第三方移动服务,需要迁移使用HMS Core服务和上线华为应用市场的时候,如何快速.便捷.高效 ...

  4. 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果

    映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...

  5. 人生第一个扩展——Github1s

    1 灵感 某天看到了一个叫github1s的仓库: 基于Node.JS.Yarn.Python等技术栈,在github.com上面加上"一秒",也就是github1s.com,就能 ...

  6. 18. VUE created 方法作用

    一般可以在created函数中调用ajax获取页面初始化所需的数据. 实例的生命周期: 每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer ...

  7. 【Azure Developer】使用Java SDK代码创建Azure VM (包含设置NSG,及添加数据磁盘SSD)

    在参考Azure官方文档进行VM创建时,发现其中没有包含如何设置NSG的内容,以及如何在创建时就添加数据磁盘的代码(设置磁盘为SSD类型).本文的内容以"使用 Java 创建和管理 Azur ...

  8. TortoiseGit2.12.0-64下载和安装【Windows10】

    TortoiseGit2.12.0-64下载和安装[Windows10] 下载 下载地址:https://tortoisegit.org/download/ 找到合适自己版本的点击后会自动下载 安装 ...

  9. goloader - golang动态加载的实现

    github地址:https://github.com/dearplain/goloader 这里有以前的一些思路:http://www.cnblogs.com/dearplain/p/8145985 ...

  10. js去重的两种方法

    去重 去重方法和思路也很多,这里就介绍两种吧. 方法一: 1 2 3 4 5 6 7 8 9 10 11 function unique1(arr) {       var res = [],     ...