简单算法Map

106 阅读1分钟

题目描述

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

该题来自洛谷p1102

输入格式

输入共两行。

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

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

输出格式

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

输入输出样例

4 1
1 1 2 3
3

说明/提示

对于 75% 的数据,1 <=N <=2000。

对于 100% 的数据,1 <=N 2 * 10^5,0 <= ai<2^30,1<= C <= 2^30。

解答

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class A-B {
    public static void main(String[] args) {
        //洛谷p1102A-B数值对
        Scanner scan = new Scanner(System.in);
        Map<Integer,Integer>map = new HashMap<>();
        int n = scan.nextInt();//表示几个正整数
        int c = scan.nextInt();//表示正整数C
        int []arr =new int[n];//数组接收数
        for (int i = 0; i < n; i++) {
            arr[i]= scan.nextInt();
            map.put(arr[i],map.getOrDefault(arr[i],0)+1);//存入Map,如果没有出现则默认为0,出现了就加1
        }
        long res = 0;//长型保证覆盖所有案例
        for (int i = 0; i < n; i++) {
            int b = arr[i]-c;//因为a-b=c,所以b按理应该为某一个map的key
            res+=map.getOrDefault(b,0);//如果b为key则加上如果没有则默认加0(即不加)
        }
        System.out.println(res);
    }
}