牛客网题库NC278873连点成线

链接:登录—专业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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值