链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题号:NC278873
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
~~~~~~ 小红有一个 n×nn \times nn×n 大小的格子棋盘,我们使用 (i,j)(i,j)(i,j) 表示棋盘中从上往下数第 iii 行和从左往右数第 jjj 列的单元格。棋盘上有 mmm 个棋子,第 iii 个棋子的坐标是 (xi,yi)(x_i,y_i)(xi,yi) 。
~~~~~~ 对于一对棋子 iii 和 jjj ,如果满足 xi=xjx_i=x_jxi=xj 或者 yi=yjy_i=y_jyi=yj ,则两个棋子之间可以连线。
~~~~~~ 小红有点无聊,于是她把能连的线都连上了。现在,她想知道,最长的那条线,长度是多少。
~~~~~~ 特别地,如果连线数量为 000 ,则输出 000 。
输入描述:
输出描述:
输出一个整数,代表最长连线的长度。
示例1
输入
5 4
1 1
1 3
2 1
1 5
输出
4
示例2
输入
8 8
1 6
2 2
3 7
4 1
5 4
6 8
7 5
8 3
输出
0
答案
这道题一开始我是用二维数组暴力进行查找的,但是最后堆溢出了,所以想到了把二维数组拆成两个单独的,但是又发生一个问题,就是它的x相同或者y相同才可以进行比较,用这个办法就有点鸡肋,所以第一个实例通过了60%,第二个才10%,后来我突然想到哈希被我放小黑屋了,忘了还有这玩意
先不说,上代码:
import java.util.HashMap;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
//存储同x,同y下的y列表和x列表
HashMap<Integer, ArrayList<Integer>> mp1 = new HashMap<>();
HashMap<Integer, ArrayList<Integer>> mp2 = new HashMap<>();
for (int i = 0; i < m; i++) {
int x = scanner.nextInt();
int y = scanner.nextInt();
//putIfAbsent是如果x存在就不存进去,如果不存在就存进去
mp1.putIfAbsent(x, new ArrayList<>());
//将同一个x下的y列表增加元素
mp1.get(x).add(y);
//同理
mp2.putIfAbsent(y, new ArrayList<>());
mp2.get(y).add(x);
}
long ans = 0;
//遍历两种情况下的列表,x相同和y相同
for (ArrayList<Integer> values : mp1.values()) {
if (!values.isEmpty()) {
//找到列表里的最大值和最小值,相减就是这个情况下最大的连线了
int maxValue = Collections.max(values);
int minValue = Collections.min(values);
//哪个大就存哪个
ans = Math.max(ans, maxValue - minValue);
}
}
//同理
for (ArrayList<Integer> values : mp2.values()) {
if (!values.isEmpty()) {
int maxValue = Collections.max(values);
int minValue = Collections.min(values);
ans = Math.max(ans, maxValue - minValue);
}
}
System.out.println(ans);
}
}