首页 > 其他分享 >二分查找进阶版

二分查找进阶版

时间:2023-01-07 19:00:34浏览次数:45  
标签:二分 arr 下标 进阶 ll mid long 查找

一、题目

时间限制:500ms

空间限制:64MB

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

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

二分查找进阶版_时间复杂度

二、解题思路

那么我们该怎么根据值找下标呢,如果能做到一对一映射,每个值对应一个下标,实际上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;
}

标签:二分,arr,下标,进阶,ll,mid,long,查找
From: https://blog.51cto.com/u_15740457/5995726

相关文章

  • 自定义数据类型:结构体(C语言进阶)
    结构体类型的声明结构体的自引用结构体内存对齐结构体传参自学b站“鹏哥C语言”笔记。一、结构体类型的声明详见文章【初识结构体】第一部分。补充说明:匿名结构体类型:省略结......
  • 数据的存储(C语言进阶)
    数据类型介绍内置数据类型的归类整型在内存中的存储:①原码、反码、补码②大小端字节序③char的存储内容浮点型在内存中的存储自学b站“鹏哥C语言”笔记。一、数据类型介绍......
  • 指针详解(C语言进阶)
    字符指针指针数组自学b站“鹏哥C语言”笔记。本章笔记不全。回顾:在文章【初识指针】中,我们已经了解到的指针概念有指针是一种变量,用来存放地址,地址唯一标识一块内存空间。指......
  • SQL209 查找employees表emp_no与last_name的员工信息
    SQL209查找employees表emp_no与last_name的员工信息题目有一个员工表employees,请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆......
  • Python----函数进阶
    函数的返回值作为参数传递给其他函数deffunc():return50deffunc1(num):print(num+100)func1(func())函数返回多个值deffunc():#返回值可以是......
  • VBA查找、匹配函数 Find 、Match
      Range.Find方法(Excel) 表达式.Find (What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)特别重要的......
  • LaTeX 进阶语法
    目录LaTeX进阶语法一、样式排版1、字体和字号1.1字体样式1.2字号1.3ctex宏包更改中文字体1.4文字装饰2、段落格式和间距2.1长度和长度变量2.2行距2.3段落格式2.4......
  • 二分查找
    一、二分查找核心1)二分查找的原理二分查找(Binarysearch)也称折半查找,是一种效率较高的查找方法。 设置查找区间:low=0;high=n;若low>high时仍未找到,则查找失败;否......
  • 算法—查找三数相加为零的三元组
    packagealgorithm;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;/***给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b......
  • 查找所有树的直径都经过的边的数量
    P3304目录大体思路code此题思路上跟https://www.cnblogs.com/kingbuffalo/p/17027323.html上的思路差不多。目录大体思路第一遍dfs找到最远点第二遍dfs找到直......