题目描述
度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数x,y来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。
输入描述:
第一行一个数n(2≤n≤1000)表示点数,接下来每行一对整数xi,yi(-1e9<=xi,yi<=1e9)表示网格上的点
输出描述:
一行输出最小面积
输入例子:
2
0 0
0 3
输出例子:
9
解题
第一反应求任意了点横纵坐标差的绝对值的最大值,时间复杂度O(N*N)
这样应该不好,然后考虑到这一的正方形其作用的点在左上 和 右下,只有这两个点起作用,左上最小点 则右下就是最大点,这样只要线性时间就可以了。
有一点要说明下,下面对 横坐标 和纵坐标 的最值 是分开计算的,由于x的最小可能对于y的最大,两者相对独立的
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); int minX = in.nextInt(); int minY = in.nextInt(); int maxX = minX; int maxY = minY; for(int i = 0;i<n-1;i++){ int x = in.nextInt(); int y = in.nextInt(); minX = Math.min(minX,x); minY = Math.min(minY,y); maxX = Math.max(maxX,x); maxY = Math.max(maxY,y); } int d1 = Math.abs(maxX - minX); int d2 = Math.abs(maxY - minY); int d = Math.max(d1,d2); System.out.println(d*d); } } }