136. 邻值查找

简介: 136. 邻值查找

136. 邻值查找


136. 邻值查找
给定一个长度为 n 的序列 A,A 中的数各不相同。
对于 A 中的每一个数 Ai,求:
min1≤j<i|Ai−Aj|
以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。
输入格式
第一行输入整数 n,代表序列长度。
第二行输入 n 个整数A1…An,代表序列的具体数值,数值之间用空格隔开。
输出格式
输出共 n−1 行,每行输出两个整数,数值之间用空格隔开。
分别表示当 i 取 2∼n 时,对应的 min1≤j<i|Ai−Aj| 和 Pi 的值。
数据范围
n≤105,|Ai|≤109
输入样例:
3
1 5 3
输出样例:
4 1
2 1


#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int>PII;
const int N=1e5+10;
int n;
int p[N],l[N],r[N];
PII a[N],ans[N];
int main(){
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>a[i].first;
    a[i].second=i;
  }
  sort(a+1,a+n+1);
  a[0].first=3e9,a[n+1].first=-3e9;
  for(int i=1;i<=n;i++){
    l[i]=i-1,r[i]=i+1;
    p[a[i].second]=i;//记下每个点在下标中的位置 
  }
  for(int i=n;i>=1;i--){
    int j=p[i],left=l[j],right=r[j];
    ll lv=abs(a[j].first-a[left].first);
    ll rv=abs(a[right].first-a[j].first);
    if(lv<=rv)ans[i]={lv,a[left].second};
    else ans[i]={rv,a[right].second};
    r[left]=right,l[right]=left;
  } 
  for(int i=2;i<=n;i++)
  cout<<ans[i].first<<' '<<ans[i].second<<endl;
  return 0;
} 
目录
相关文章
|
5月前
|
算法 C++
查找方式:依次查找与二分查找
查找方式:依次查找与二分查找
|
算法
查找
查找是指在图中寻找特定的节点或边的过程。在图中进行查找操作可以帮助我们找到与目标节点或边相关的信息,或者判断图中是否存在某个节点或边。 在图中进行查找操作的常见算法有: 1. 深度优先搜索(DFS):从图中的一个节点开始,沿着一条路径一直深入直到无法再深入为止,然后回溯到上一个节点,继续深入其他路径,直到找到目标节点或遍历完所有节点。 2. 广度优先搜索(BFS):从图中的一个节点开始,先访问它的所有邻居节点,然后再依次访问邻居的邻居节点,直到找到目标节点或遍历完所有节点。 3. Dijkstra算法:用于在带权有向图中找到从一个节点到其他节点的最短路径。该算法通过不断更新节点的最短距离来逐步
86 0
|
8月前
查找数据
查找数据。
48 1
|
8月前
排序和查找
排序和查找
64 0
|
搜索推荐
查找-之二叉排序树(查找、插入、删除)
有序的线性表采用:折半/二分、插值、斐波那契查找相比顺序查找效率得到提高,但是在插入和删除时效率低(为维持数据的有序性) 在高效实现查找操作时,如何提高插入和删除的效率? 在一些应用场景:在查找时需要插入和删除
169 0
查找-之二叉排序树(查找、插入、删除)
|
存储 算法
查找-之有序表查找
待查找的表是有序排列的
104 0
查找-之有序表查找
|
存储 机器学习/深度学习 算法
如何更快速地查找
查找算法在计算机程序设计中占据着主要的核心位置,查找算法的效率直接影响着计算机程序设计与开发的结果与速度。本章主要会讲到顺序查找、二分查找、索引查找和哈希查找这四种查找算法以及效率分析。掌握了相关查找算法,不管是在代码编程计算机技术上面,还在日常生活中都会有很大的用处。
277 0
|
存储 算法 Java
练习2—数据查找
练习2—数据查找
106 0
|
测试技术
简单查找
给定一个集合,查找元素是否在集合中出现。
134 0
ZCMU - 4925: 字符串的查找删除
ZCMU - 4925: 字符串的查找删除
129 0

热门文章

最新文章

下一篇
开通oss服务