首页 > 其他分享 >邻值查找

邻值查找

时间:2024-12-08 22:10:23浏览次数:2  
标签:int pos 邻值 查找 坐标 数组 include first

给定一个长度为 nn 的序列 AA,AA 中的数各不相同。

对于 AA 中的每一个数 AiAi,求:

min1≤j<i|Ai−Aj|min1≤j<i|Ai−Aj|

以及令上式取到最小值的 jj(记为 PiPi)。若最小值点不唯一,则选择使 AjAj 较小的那个。

输入格式

第一行输入整数 nn,代表序列长度。

第二行输入 nn 个整数A1…AnA1…An,代表序列的具体数值,数值之间用空格隔开。

输出格式

输出共 n−1n−1 行,每行输出两个整数,数值之间用空格隔开。

分别表示当 ii 取 2∼n2∼n 时,对应的 min1≤j<i|Ai−Aj|min1≤j<i|Ai−Aj| 和 PiPi 的值。

数据范围

n≤105n≤105,|Ai|≤109|Ai|≤109

输入样例:

3
1 5 3

输出样例:

4 1
2 1

 

##其思想在于 我们建立双向链表,将原数组A1…AnA1…An从小到大排序,并增加一个数组B记录An原本的排列

思路

  step1:1 5 3 其坐标是1 2 3  

  step2:进行排序 得到 1 3 5 其坐标 1 3 2 (原始坐标)

  step4:我们从坐标最后一位i,即坐标3,开始进行计算min1≤j<i|Ai−Aj| ,因为不会有其它位在最后一位i之后了,

    可以保证最后一位i的左右位置即坐标1和坐标2都小于它(坐标3)

    (原始坐标) 1 3 2 其中 1<3 ,2<3;

  step5 最后坐标3的元素被判断结束,我们可以删除它,即变为1 3

结构:

  我们模拟双向链表来实现删除其中的元素。

  pair用于存储元素及其原始坐标。

  接下来将其排序,再创建一个数组P用来映射,将变换过的排序以顺序读入,

  l和r用来记录该数组该位置前一个元素和后一个元素。

  通过l和r进行前后遍历,当数组被删除同时改变l和r数组的结构即可,即上一位r指向该节点的下一位,

  下一位l指向该节点前一位。

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <utility>
using namespace std;

const int N = 1e5 + 10;
int p[N], l[N], r[N], n;
pair<int, int> a[N], ans[N];

int main() {
    ios::sync_with_stdio(false); 
    cin.tie(nullptr); 

    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i].first;
        a[i].second = i;
    }

    a[0].first = 1e9;
    a[n + 1].first = -1e9;
    sort(a + 1, a + n + 1);

    for (int i = 1; i <= n; i++) {
        p[a[i].second] = i;
        l[i] = i - 1;
        r[i] = i + 1;
    }

    for (int i = n; i >= 2; i--) {
        int pos = p[i];
        int Left = l[pos];
        int Right = r[pos];
        int vl = abs(a[pos].first - a[Left].first);
        int vr = abs(a[pos].first - a[Right].first);
        if (vl <= vr) {
            ans[i].first = vl;
            ans[i].second = a[Left].second;
        }
        else {
            ans[i].first = vr;
            ans[i].second = a[Right].second;
        }
        r[Left] = Right;
        l[Right] = Left;
    }

    for (int i = 2; i <= n; i++) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}
        

标签:int,pos,邻值,查找,坐标,数组,include,first
From: https://www.cnblogs.com/AnnaStore/p/18593885

相关文章

  • LINQ 和集合:如何使用LINQ查找两个列表之间的差集(C#)
    此示例演示如何使用LINQ对两个字符串列表进行比较,并输出那些位于第一个集合(而不是第二个集合)中的行。名称的第一个集合存储在文件 names1.txt 中:Bankov,PeterHolm,MichaelGarcia,HugoPotra,CristinaNoriega,FabricioAw,KamFooBeebe,AnnToyoshima,TimGuy......
  • 邻值查找
     给定一个长度为 nn 的序列 AA,AA 中的数各不相同。对于 AA 中的每一个数 AiAi,求:min1≤j<i|Ai−Aj|min1≤j<i|Ai−Aj|以及令上式取到最小值的 jj(记为 PiPi)。若最小值点不唯一,则选择使 AjAj 较小的那个。输入格式第一行输入整数 nn,代表序列长度。第二行输入 nn......
  • JavaScript查找数组中某个元素的位置
    indexOf:在JavaScript中,你可以使用indexOf()方法来查找数组中元素的位置。如果元素不存在于数组中,indexOf()会返回-1。letindex=array.indexOf('x')if(index!=-1){//...}findIndex:如果你需要查找的是复杂对象数组,你可能需要自定义一个查找函数,使用findIndex()letobj......
  • 二分查找及java代码实现
    二分查找(BinarySearch)是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来确定目标值所在的范围,然后在这个范围内继续进行二分查找,直到找到目标值或确定目标值不存在。二分查找的基本步骤:1. 初始化:设置两个指针,一个指向数组的开始(low),另一个指向......
  • 【hot100】二分查找
    文章目录二分写法获取等于target的最左侧的索引获取等于target的最右侧的索引35.搜索插入位置二分实现74.搜索二维矩阵O(logmn)解法O(n+logm)解法34.在排序数组中查找元素的第一个和最后一个位置二分查找33.搜索旋转排序数组两次二分一次二分153.寻找旋转排序......
  • 根据元素ID遍历树形结构,查找到所有父元素ID [代码]
    functionfindParentIds(elementId,treeData){constparentIds=[];functiontraverse(node){if(node.id===elementId){returntrue;}if(node.children){for(constchildofnode.children){if(traverse(child))......
  • 牛客---HJ48 从单向链表中删除指定值的节点(用ArrayList模拟链表,因为方便查找操作)
    示例代码importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;//注意类名必须为Main,不要有任何packagexxx信息publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);......
  • 数据结构实训——查找
    声明: 以下是我们学校在学习数据结构时进行的实训,如涉及侵权马上删除文章声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。一、实训类型  验证性实训二、实训目的与任务1.掌......
  • 二分查找
    [Algo]二分查找注:Algo系列基于左神算法教程,提供C++实现。1.经典算法//1.经典二分查找:给定有序序列,查找val,存在返回(任一)索引,否则返回-1intbinarySearch(constvector<int>&v,intval){if(v.size()==0)return-1;intleft=0,right=v.size()-1,m......
  • Java入门:21.System类,Runtime类,Arrays类的常用方法,二分查找算法
    1System类System.exit(0); //手动关闭应用程序​System.currentTimeMillis();//获得当前系统时间的毫秒数​System.out;//获得一个打印流,可以实现控制台打印System.out.print();//打印内容(不换行)System.out.println();//打印内容,并换行System.out.printf();//......