题解

简介: AcWing 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 <cstring>
#include <iostream>
#include <algorithm>
#include <set>

using namespace std;
typedef long long LL;
typedef pair<LL, int> PII;

const int N = 100010;

int n;
set<PII> S;

int main()
{
    cin >> n;

    S.insert({2e18, 0});            //哨兵
    S.insert({-2e18, 0});

    for(int i = 1;i <= n;i ++)
    {
        int a;
        cin >> a;

        if(i > 1)
        {
            auto r = S.lower_bound({a, i});
            auto l = r;
            l --;

            LL al = abs(l->first - a);
            LL ar = abs(r->first - a);
            if(al <= ar) cout << al << ' ' << l->second << endl;
            else cout << ar << ' ' << r->second << endl;
        }

        S.insert({a, i});
    }
    return 0;
}
目录
相关文章
leetcode 283 移动零
leetcode 283 移动零
58 0
LeetCode 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
89 0
|
算法
leetcode第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
110 0
leetcode第34题
leetcode第36题
一个 9 * 9 的数独的棋盘。判断已经写入数字的棋盘是不是合法。需要满足下边三点, • 每一行的数字不能重复 • 每一列的数字不能重复 • 9 个 3 * 3 的小棋盘中的数字也不能重复。 只能是 1 - 9 中的数字,不需要考虑数独最后能不能填满
leetcode第36题
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
leetcode第12题
相当简洁了,主要就是把所有的组合列出来,因为罗马数字表示的大小就是把所有字母相加,所以每次 append 那个,再把对应的值减去就行了。 时间复杂度:不是很清楚,也许是 O(1)?因为似乎和问题规模没什么关系了。 空间复杂度:O(1)
leetcode第12题
|
人工智能
leetcode第22题
而这个数列,其实除了括号匹配,还有很多类似的问题,其本质是一样的,例如, 2n 个人排队买票,其中 n 个人持 50 元,n 个人持 100 元。每张票 50 元,且一人只买一张票。初始时售票处没有零钱找零。请问这 2n 个人一共有多少种排队顺序,不至于使售票处找不开钱? 对于一个无限大的栈,一共n个元素,请问有几种合法的入栈出栈形式? P = a1 a2 a3 ... an,其中 ai 是矩阵。根据乘法结合律,不改变矩阵的相互顺序,只用括号表示成对的乘积,试问一共有几种括号化方案? n 个结点可构造多少个不同的二叉树?
leetcode第22题