P1102 A-B 数对

1.题目介绍

A-B 数对

题目背景

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

题目描述

给出一串正整数数列以及一个正整数 \(C\),要求计算出所有满足 \(A - B = C\) 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数 \(N,C\)。

第二行,\(N\) 个正整数,作为要求处理的那串数。

输出格式

一行,表示该串正整数中包含的满足 \(A - B = C\) 的数对的个数。

样例 #1

样例输入 #1

复制代码
4 1
1 1 2 3

样例输出 #1

复制代码
3

提示

对于 \(75\%\) 的数据,\(1 \leq N \leq 2000\)。

对于 \(100\%\) 的数据,\(1 \leq N \leq 2 \times 10^5\),\(0 \leq a_i <2^{30}\),\(1 \leq C < 2^{30}\)。

2017/4/29 新添数据两组

2.题解

注意这里由于每组两两组合都可能满足条件,所以这里的结果记录变量 ans 可能是 N^2 大小,这里使用long long 记录!!!

2.1 哈希表

思路

类似 1.两数之和

代码

C++ 复制代码
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int main(){
	int N, C;
	cin >> N >> C;
	vector<int> arr(N); 
	unordered_map<int,int> mp(N); 
	for(int i = 0; i < N; i++) {
		cin >> arr[i];
		mp[arr[i]]++; 
	}
	long long ans = 0;
	for(int i = 0; i < N; i++){
		if(mp.count(arr[i] - C)) ans += mp[arr[i] - C];
	}
	
	cout <<  ans;
} 

复杂度分析

1.空间复杂度:数组,哈希表 O(N)

2.时间复杂度: 哈希表 O(1), 数组遍历 O(N). 总体O(N)

2.2 双指针法

思路

先排序,之后利用单调性,使用双指针构建结果区域,求得具体长度。

比如像目前数为s[i],我要找到s[i]-C。l为s[l]首个大于等于s[i]-C的数,r为s[r]首个大于s[i]-C的数,由二者共同构建的区域长度即为所需长度。

代码

C++ 复制代码
#include <bits/stdc++.h>
using namespace std;
int main(){
	int N, C;
	cin >> N >> C;
	vector<int> arr(N); 
	for(int i = 0; i < N; i++) {
		cin >> arr[i];
	}
	// sort(arr, arr + N); //这是对于数组的排序,不是对于vector的排序,vector用迭代器即可
	sort(arr.begin(), arr.end()); 
	long long ans = 0;
	int l = 0, r = 0;
	/*1. 这里为何l,r不需要回溯?因为arr[i]-C在不断增大,l和r必定是右移
	*2.由于跳出while循环条件是第一个不满足该条件的情况出现,所以这里l指向区域首部第一个节点,r指向区域尾部节点的下一个节点,长度即r-l*/
	for(int i = 0; i < N; i++){
		while(arr[l] < arr[i] - C && l < N) l++;
		while(arr[r] <= arr[i] - C && r < N) r++;
		if(s[i] - s[l] == c) ans += r - l; //这里的判断并不是非常有必要?
	}
	cout <<  ans;
} 

复杂度分析

1.空间复杂度: 使用了数组 O(n)

2.时间复杂度:由排序决定O(nlogn){后面的数组遍历,由于l和r无需回溯所以就是O(n)}

2.3

相关推荐
源代码•宸7 小时前
Redis 攻略(Redis Object)
数据库·redis·后端·缓存·字符串·哈希表·type
全栈游侠1 天前
数据结构 -哈希表
数据结构·哈希表
睡不醒的kun2 天前
不定长滑动窗口-求子数组个数
数据结构·c++·算法·leetcode·职场和发展·双指针·滑动窗口
伟大的车尔尼2 天前
双指针题目:复写零
双指针
拾光Ծ3 天前
【优选算法】双指针算法:专题二
c++·算法·双指针·双指针算法·c++算法·笔试面试
闻缺陷则喜何志丹4 天前
【前缀树(字典树)】P12124 [蓝桥杯 2024 省 B 第二场] 前缀总分|普及+
c++·算法·蓝桥杯·字典树·前缀树·洛谷
闻缺陷则喜何志丹5 天前
【BFS 动态规划】P12382 [蓝桥杯 2023 省 Python B] 树上选点|普及+
c++·蓝桥杯·动态规划·宽度优先·洛谷
闻缺陷则喜何志丹5 天前
【数论】P12191 [蓝桥杯 2025 省研究生组] 01 串|普及+
c++·数学·蓝桥杯·数论·洛谷
艾莉丝努力练剑6 天前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
老鼠只爱大米8 天前
LeetCode经典算法面试题 #24:两两交换链表中的节点(迭代法、递归法等多种实现方案详细解析)
算法·leetcode·链表·递归·双指针·迭代·链表交换