问题描述:

给定两个数组arrx和arry,长度都为N。代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点?

思想

坐标系中两个点的位置关系可以分为以下几种情况:共点、共X轴、共Y轴、两点连线有些率。我们根据上面情况,依次遍历每一个数组位置上点与数组后面位置上点之间的关系(这是因为我们在每一次遍历代表的含义是:如果通过这个点,最多直线可以通过几个点。所以遍历到数组i位置时,表示通过前面的点的直线穿过的点不是最多,所以可以不进行遍历)。

代码

准备代码

    public static int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}

在统计斜率时,K代表斜率(x_y)V代表点的个数。

    public static int maxPoints1(int[] arrx, int[] arry) {if (arrx == null || arrx.length == 0 || arry == null || arry.length == 0) {return 0;}if (arrx.length <= 2) {return arrx.length;}//斜率//k:x_y   v:intHashMap<String, Integer> map = new HashMap<>();//结果int res = 0;for (int i = 0; i < arrx.length; i++) {map.clear();map.put("_", 0);String key = "_";//共点int point = 1;//共xint xNum = 0;//共yint yNum = 0;int maxKey = 0;for (int j = i + 1; j < arrx.length; j++) {int x = arrx[i];int y = arry[i];if (x == arrx[j] && y == arry[j]) {//共点point++;} else if (y == arry[j]) {xNum++;} else if (x == arrx[j]) {yNum++;} else {//存在斜率int tempX = arrx[j] - x;int tempY = arry[j] - y;int gcd = gcd(tempX, tempY);int kX = tempX / gcd;int kY = tempY / gcd;key = kX + "_" + kY;if (!map.containsKey(key)) {map.put(key, 1);} else {map.put(key, map.get(key) + 1);}maxKey = Math.max(maxKey, map.get(key));}}res = Math.max(res,Math.max(xNum, Math.max(yNum, maxKey)) + point);}return res;}

在统计斜率时,使用两个map嵌套,外面的map K表示x V值嵌套一个map K为y V为点的个数。

    public static class Point {public int x;public int y;Point() {x = 0;y = 0;}Point(int a, int b) {x = a;y = b;}}public static int maxPoints2(Point[] points) {if (points == null) {return 0;}if (points.length <= 2) {return points.length;}Map<Integer, Map<Integer, Integer>> map = new HashMap<>();int result = 0;for (int i = 0; i < points.length; i++) {map.clear();int samePosition = 1;int sameX = 0;int sameY = 0;int line = 0;for (int j = i + 1; j < points.length; j++) {int x = points[j].x - points[i].x;int y = points[j].y - points[i].y;if (x == 0 && y == 0) {samePosition++;} else if (x == 0) {sameX++;} else if (y == 0) {sameY++;} else {int gcd = gcd(x, y);x /= gcd;y /= gcd;if (!map.containsKey(x)) {map.put(x, new HashMap<Integer, Integer>());}if (!map.get(x).containsKey(y)) {map.get(x).put(y, 0);}map.get(x).put(y, map.get(x).get(y) + 1);line = Math.max(line, map.get(x).get(y));}}result = Math.max(result, Math.max(Math.max(sameX, sameY), line) + samePosition);}return result;}

测试代码

    public static Point[] ToShift(int[] arrx, int[] arry) {if (arrx == null || arrx.length == 0 || arry == null || arry.length == 0) {return null;}Point[] res = new Point[arrx.length];for (int i = 0; i < arrx.length; i++) {Point temp = new Point(arrx[i], arry[i]);res[i] = temp;}return res;}public static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[maxSize];for (int i = 0; i < arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) ((maxValue + 1) * Math.random());}return arr;}public static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}public static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}public static void main(String[] args) {int maxSize = 20;int maxValue = 200;int testTime = 500000;System.out.println("test begin!");for (int i = 0; i < testTime; i++) {int[] arrX1 = generateRandomArray(maxSize, maxValue);int[] arrY1 = generateRandomArray(maxSize, maxValue);int[] arrX2 = copyArray(arrX1);int[] arrY2 = copyArray(arrY1);int res1 = maxPoints1(arrX1, arrY1);Point[] points = ToShift(arrX2, arrY2);int res2 = maxPoints2(points);if (res1 != res2) {System.out.println("Oops!");printArray(arrX1);printArray(arrY1);System.out.println(res1);System.out.println(res2);break;}}System.out.println("test end!");}

给定两个数组arrx和arry,长度都为N。代表二维平面上有N个点,第i个点的x 坐标和y坐标分别为arrx[i]和arry[i],返回求一条直线最多能穿过多少个点?相关推荐

  1. Java黑皮书课后题第10章:*10.15(几何:边框)边框是指包围一个二维平面上点集的最小矩形,编写一个方法,为二维平面上一系列点返回一个边框

    *10.15编写一个方法,为二维平面上一系列点返回一个边框 题目 程序 代码 Test15.java Test13_MyRectangle2D.java 运行结果 题目 点击这里跳转编程练习题10.1 ...

  2. Java黑皮书课后题第3章:**3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠

    **3.28(几何:两个矩形)编写一个程序,提示用户输入两个矩形中心的x坐标和y坐标以及矩形的宽度和高度,然后判断第二个矩形是在第一个矩形内,还是和第一个矩形重叠 题目 题目概述 运行示例 破题 代码 ...

  3. Unity求一条直线与平面的交点

    这个是面试官经常考的一个问题,我们先把它变成一个数学问题. 已知一个平面上的一点P0和法向量n,一条直线上的点L0和方向L,求该直线与该平面的交点P 如下图 首先我们分析一下我们知道平面和直线的法向量 ...

  4. python求梯形面积_pythonocc 求一条直线与一个梯形的交点的横坐标

    坐标系为ZOX坐标系,X轴为横轴,Y轴为竖轴.直线为平行于X轴的一条直线.梯形为以Z轴为对称轴的梯形.附上代码. # -*- coding: utf-8 -*- """ ...

  5. C语言,n条直线最多能将圆分成多少个区域

    在一个圆上画n条直线,问最多能将圆分成多少个区域? 输入 每行一个整数,表示画n条直线,输入遇到-1结束. 输出 每行输出一个整数,为对应测试样例的答案. 要想把圆分成的块数最多,那么增加的每一条线都 ...

  6. lisp 读取样条曲线座标点_如何在lisp中求一条直线和一条曲线的交点

    ★快捷命令的命名规律 1. 快捷命令通常是该命令英文单词的第一个或前面两个字母,有的是前三个字母. 比如,直线(Line)的快捷命令是"L":复制(COpy)的快捷命令是" ...

  7. 二维平面上两个矩形之间的最小距离

    1.背景 最近遇到一个问题,可以抽象成如题目描述的问题. 如何求解例如 矩形(EFGH),矩形(IJKL),矩形(MNOP)  到矩形 ABCD的距离呢? 2.分析 最短距离 会出现在 矩形1 的边界 ...

  8. 求两个数组的最长重复子数组 Maximum Length of Repeated Subarray

    为什么80%的码农都做不了架构师?>>>    问题: Given two integer arrays A and B, return the maximum length of ...

  9. python 获取行列号两个数组相等_python – 寻找在numpy中找到两个相等长度数组之间精确重叠的最快方法...

    我正在寻找最佳(最快)的方法来找到numpy中两个数组之间的确切重叠.给定两个数组x和y x = array([1,0,3,0,5,0,7,4],dtype=int) y = array([1,4,0 ...

最新文章

  1. CodeForces 1616H Keep XOR Low {a^b≤x} / CodeForces gym102331 Bitwise Xor {a^b≥x}(trie树 + 计数)
  2. html中的保存功能代码怎么写,java保存html代码怎么写
  3. android9谷歌推送,谷歌Android 9.0系统将统一推送以改善更新碎片化
  4. Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
  5. LeetCode-Single Number
  6. Spark Standalone架构设计要点分析
  7. OOB模式下Exit事件的处理
  8. google 插件_Google浏览器常用插件与使用小技巧
  9. gbase里的分布表与复制表
  10. 推荐几个学习GIS的社区
  11. Mybatis中文文档下载地址分享
  12. 【shell】How can I create a select menu in a shell script?
  13. 台式计算机wifi老掉线,电脑连接WiFi容易断线或速度慢怎么回事 教你怎么解决
  14. AI集成产品中海量数据处理的嵌入式解决方案(一)
  15. 软渲染器(Directx11)三之世界矩阵,相机变换矩阵,透视投影矩阵,透视除法,视口变换矩阵
  16. java获取剩余手机电池容量_怎样判断手机电池的剩余容量
  17. 4.服务器的品牌和型号
  18. 内核/逻辑处理器/线程/多线程/多CPU/多核CPU
  19. ERP系统常用SQL集锦(转, 一个网友写的,感觉有点虎头蛇尾,不过还是有价值参考)...
  20. 保护水资源公益网站html,保护水资源公益广告策划书

热门文章

  1. 无人船成渡过大西洋将来发展又会如何?
  2. 网易云发送验证码短信,发送通知短信,java版
  3. 深入理解java虚拟机(六)GC垃圾回收-低延迟垃圾收集器(Shenandoah、ZGC)
  4. TNF拮抗剂的结构、功能与结核感染_Wallis2008
  5. 大一寒假训练九(map,set,vector)【更新完成】
  6. LeetCode_1677_数组中重复的数字
  7. DBA之路:小小DBA一年工作总结
  8. 我以为自己MySQL够牛逼了,直到被腾讯面试官狠狠抽了两巴掌
  9. VB:编一个子过程DeleStr(s1,s2),将字符串s1中出现的s2子字符串删去,结果存放在s1中
  10. beego使用API自动化文档生成swagger时,routers目录下无法生成commentsRouter_controllers.go文件