二分查找进阶版

简介: 二分查找进阶版

一、题目

时间限制:500ms

空间限制:64MB

很久以前,有位同学,在学完算法课的二分后,激动的振臂高呼:“我学会二分了!”。此时,一位学长从旁边经过听到此话,决定出一道题考考他,挫挫同学的锐气,让这位学弟再去好好刷二分.

学长告诉学弟n个数据,再询问他q次,每次询问告诉学弟一个x,要求学弟在每次询问给出的x的下标。

image.png

二、解题思路

那么我们该怎么根据值找下标呢,如果能做到一对一映射,每个值对应一个下标,实际上map可以做到

这个事情,也就是所谓的哈希。但是顺序是乱序,不能进行二分查找(二分查找的前提是顺序)

当然如果不使用map,我们可以尝试把无序的序列变成有序的,这时候查找值,我们就可以采取二分查找,那下标咋办呢,把下标和值绑定在一起就行,开个结构体存下标和值,排序的时间复杂度是 nlog^n ,二分查找的时间复杂度也是 nlog^n ,时间复杂度也在允许范围之内。值得注意的是,数据范围在 long long 之内,注意别爆 int 了(三年ACM一场空,不开longlong见祖宗)

三、源码及注释

#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>//sort函数的头文件
using namespace std;
const long long N = 1e6 + 5;//满足题目对n的要求,并且稍微开大一点(+5)
typedef long long ll;//重新定义long long类型,更加方便
ll n, q, x;
struct node
{
  ll idx, num;
}arr[N];//创建结构体存储数组中的值和下标
bool cmp(node x, node y)
{
  return x.num < y.num;
}//自定义数组元素排序方法
int main()
{
  scanf("%lld%lld", &n, &q);//当数据过多时,不采用cout/cin函数,采用scanf和printf函数
  for (int i=1;i<=n;i++)
  {
    scanf("%lld", &arr[i].num);//注意long long的打印格式
    arr[i].idx = i;
  }
  sort(arr+1, arr + n+1,cmp);
  for (int i=1;i<=q;i++)
  {
    scanf("%lld", &x);
    ll left = 1;
    ll right = n;
    ll mid = 0;
    while (right >= left)
    {
      mid = (left + right) / 2;
      if (arr[mid].num > x)
      {
        right=mid-1;//注意最基本的二分查找
      }
      else if (arr[mid].num < x)
      {
        left=mid+1;
      }
      else
      {
        break;
      }
    }
    if (left <= right)
    {
      printf("%lld\n", arr[mid].idx);
    }
  }
  return 0;
}
相关文章
|
11天前
|
算法 索引
【算法】——二分查找合集
二分查找基础模版和进阶模版,查找元素位置,搜索插入位置,x的平方根,山脉数组的峰顶索引,寻找峰值,点名
|
3月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
25 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
7月前
|
算法
算法入门——二分查找
算法入门——二分查找
40 0
|
8月前
|
算法 索引
【数据结构与算法 | 基础篇】力扣704/35/34:二分查找
【数据结构与算法 | 基础篇】力扣704/35/34:二分查找
|
8月前
|
算法 索引
【刷题】 二分查找入门
二分算法是一种非常强大的算法!!!
38 1
|
8月前
|
算法 索引
【刷题】 二分查找进阶
二分查找的算法思想是很好理解的。朴素二分很容易,但一般常使用左端点查找与右端点查找来解决问题。
46 0
|
8月前
|
算法 搜索推荐 C++
排序前言&冒泡排序
排序前言&冒泡排序
51 0
|
算法 Java 测试技术
二分查找算法简单进阶
这里将对刷题笔记一文末提及的几道推荐二分法进阶题目进行说明介绍。一道简单题加了一定的文字修饰,一道中等题巧用二分查找,以下为刷题笔记一链接,题目链接在文末提供。
165 0
|
存储 C++
【C++进阶】三、二叉搜索树
目录 一、二叉搜索树 1.1 概念 1.2 二叉搜索树操作 二、二叉搜索树实现 2.1 框架总览 2.2 实现接口总览 2.2.1 构造函数 2.2.2 拷贝构造 2.2.3 赋值重载 2.2.4 析构函数 2.2.5 二叉搜索树的遍历 2.2.6 插入函数 2.2.7 查找函数 2.2.8 删除函数 2.3 二叉搜索数完整代码 三、二叉搜索树的应用 3.1 K模型 3.2 KV模型 四、二叉搜索树的性能分析
66 0
【C++进阶】三、二叉搜索树