二分搜索典型应用(一)从有序数组中查找某个值
2017-04-17 21:14
393 查看
二分搜索的第一个典型应用——查找值
样例输入:
样例输出:
因为是有序性,我们可以看一下n/2的值,如果a[n/2] >= k,就可以知道解不大于n/2。反之如果a[n/2] < k,则解大于n/2,依次以同样方式查找,这样这个算法的复杂度将从O(n)缩减到O(logn),优化成功。
代码如下:
然而STL中就有以lower_bound函数的形式实现二分搜索,即查找大于或者等于x的第一个位置。
lower_bound:
问题描述:给定长度为n的单调不下降数列a0...an-1和一个数k,求满足ai >= k条件的最小i。不存在时输出n。
样例输入:
n = 5 a = {2, 3, 3, 5, 6} k = 3
样例输出:
1
分析
这个问题完全可以暴力(暴力2333),但是有更好更高效的算法。因为是有序性,我们可以看一下n/2的值,如果a[n/2] >= k,就可以知道解不大于n/2。反之如果a[n/2] < k,则解大于n/2,依次以同样方式查找,这样这个算法的复杂度将从O(n)缩减到O(logn),优化成功。
代码如下:
#include<cstdio> using namespace std; const int maxn = 1000000; int a[maxn]; int n,k; void solve() { int lb = -1, ub = n; while(ub - lb > 1) { int mid = (ub + lb)/2; if(a[mid] >= k) ub = mid; else lb = mid; } printf("%d\n", ub); } int main() { scanf("%d%d",&n,&k); for(int i=0; i<n; i++) { scanf("%d",&a[i]); } solve(); return 0; }
然而STL中就有以lower_bound函数的形式实现二分搜索,即查找大于或者等于x的第一个位置。
相关文章推荐
- 折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
- 二分查找:在有序数组中搜索大于等于x的数的最小下标
- 插入元素到有序数组,二分搜索查找插入位置
- 数组封装应用及有序数组、二分查找源码实现
- 二分查找突破上下限,树状数组的三种应用。
- 二分查找变体之循环有序数组找分界点
- 有序数组的二分查找
- 在一个旋转过的有序数组上实现二分查找 收藏
- 在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级
- hihocoder#1128之非有序数组二分查找
- 面试杂题(三)有序数组中连续k的个数(含二分搜索的递归非递归写法)
- 有序数组的二分查找
- 实现有序列表(基于数组,二分查找)
- 有序 循环数组的二分查找
- [LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)
- hihocoder#1133之非有序数组二分查找k小数
- 9.5-字符串有序数组的二分查找
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 二分查找在数组中应用的若干实例
- 二分查找有序数组中某个数的所在范围 Search for a Range