精华内容
下载资源
问答
  • 题: 有n个直线最多可以把一个平面分成多少部分 <br> 线条数:<input type=”text” id=”line”/> 内交点:”innerPoint”></label><br> 分割数:”part” xss=removed></label><br> <input ...
  • sum=n(n-1)/2 (n直线的个数) 视频讲解

    sum=n(n-1)/2 (n是直线的个数)

    视频讲解

    展开全文
  • 需求:给定一二维平面平面上有 n 个点,求最多有多少个点在同一条直线上。 分析思路: 1、将所有二维坐标化,即定义出所有的x,y坐标值 2、遍历出所有取出两的情况(不考虑先后顺序),根据任意两都确定一...

    需求:给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    分析思路:
    1、将所有点二维坐标化,即定义出所有点的x,y坐标值
    2、遍历出所有取出两点的情况(不考虑先后顺序),根据任意两点都确定一条直线,直线参数为k斜率,b与y轴交点的纵坐标(此时x=0),将他们放入一个列表中
    3、将所有直线放入一个集合并完成去重操作,增加直线的第三个参数n=0用于第四步判断每条直线上有几个点
    4、将所有点遍历并判断是否在集合中的直线上,若在直线上,则直线对应的n加1
    5、遍历所有代表直线的列表,取出n最大的直线其n值就是最多有n个点在此条直线上

    def line(point1, point2):     
    	#定义一个函数通过两点来计算出对应直线的参数,
    	#传入的参数point1、point2都是列表
    	try:
            y1 = point1[1]
            y2 = point2[1]
            x1 = point1[0]
            x2 = point2[0]
      	    #根据列表对应下标取出x、y值
            k = (y2-y1)/(x2-x1)
            #根据x、y值计算出斜率,当斜率无穷大时报错,进入except
            b = y1-k*x1
            #计算出b
            return [k, b,0]
            #返回直线参数,第三个参数为0,用来后面的计数
        except Exception:
            return ["+8", y1, 0]
            #当报错时意味着斜率为无穷大,我们用"+8"代替
    
    
    def judge_in(point_in, line_in):
    	#用来判断点是否在直线上,若在则返回True,
    	#若不在则返回False
        x_in = point_in[0]
        y_in = point_in[1]
        k_in = line_in[0]
        b_in = line_in[1]
        if k_in == "+8":
        #当斜率无穷大时,单独判断
            if b_in == y_in:
                return True
            else:
                return False
        elif y_in == x_in*k_in+b_in:
            return True
        else:
            return False
    
    """可以改变下方列表中点的参数"""
    point_list = [[1, 1], [3, 2], [5, 3], [4, 1], [2, 3], [1, 4]]
    #给出一个包含几个点的列表
    
    
    # point_list = [[1,1],[2,2],[3,3]]
    line_list = []
    #新建一个用来接收直线的空列表
    new_list = []
    #直线去重后加入此列表
    for i in range(len(point_list)):
        for j in range(i+1, len(point_list)):
        #通过双层的for循环给出所有两个点的组合
            line_s = line(point_list[i], point_list[j])
            #利用函数求出直线的前两个参数
            line_list.append(line_s)
    
    print(line_list)
    #得到的是一组有重复参数的直线
    for k in line_list:
        if k not in new_list:
        #去重
            new_list.append(k)
    for m in point_list:
        for n in new_list:
        #遍历所有点和线,判断点是否在线上,
        #若在则直线第三个用来计数的参数加1
            if judge_in(m, n):
                n[2] += 1
    print(new_list)
    #输出去重完毕后的列表,再经过一次遍历即可找出最多点所在的直线
    
    展开全文
  • 给定一二维平面平面上有 n 个点,求最多有多少个点在同一条直线上。 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | o ±------------> 0 1 2 3 4 示例 2: 输入: [[1,1],[3,2],[5,3],[4,1],...

    给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    示例 1:

    输入: [[1,1],[2,2],[3,3]]
    输出: 3
    解释:
    ^
    |
    | o
    | o
    | o
    ±------------>
    0 1 2 3 4
    示例 2:

    输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
    输出: 4
    解释:
    ^
    |
    | o
    | o o
    | o
    | o o
    ±------------------>
    0 1 2 3 4 5 6

    思路:

    int samePosition = 1; //同位的点个数
    int sameX = 0; //同X个数
    int sameY = 0; //同Y个数
    int line = 0; //同斜率个数(防止精度丢失,需要使用特殊方式,这是采用gcd+hash存x和y,不计算k)
    在这里插入图片描述

    代码

     public int maxPoints(int[][] points) {
            Point[] p = changePoints(points);
            return maxPoints(p);
        }
        public static class Point {
            public int x;
            public int y;
    
            Point() {
                x = 0;
                y = 0;
            }
    
            Point(int a, int b) {
                x = a;
                y = b;
            }
        }
    
        /**
         * 把数组转换为Point对象
         * @param points
         * @return
         */
        public static Point[] changePoints(int[][] points){
            Point[] p = new Point[points.length];
            for(int i=0;i<points.length;i++){
                p[i] = new Point(points[i][0],points[i][1]);
            }
            return p;
        }
    
        /**
         * 核心代码:求穿过的最大点
         * @param points
         * @return
         */
        public static int maxPoints(Point[] points) {
            if (points == null) {
                return 0;
            }
            if (points.length <= 2) {
                return points.length;
            }
            Map<Integer, Map<Integer, Integer>> map = new HashMap<Integer, Map<Integer, Integer>>();
            int result = 0;
            for (int i = 0; i < points.length; i++) {
                map.clear();
                int samePosition = 1; //同位的点个数
                int sameX = 0; //同X个数
                int sameY = 0; //同Y个数
                int line = 0; //同斜率个数(防止精度丢失,需要使用特殊方式,这是采用gcd+hash存x和y,不计算k)
                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) {//同X
                        sameX++;
                    } else if (y == 0) {//同Y
                        sameY++;
                    } else { //同斜率(防止精度丢失,需要使用特殊方式,这是采用gcd+hash存x和y,不计算k)
                        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)  //返回最大点数:同位+max(max(同x,同y),同斜率)
                        + samePosition);
            }
            return result;
        }
    
        public static int gcd(int a, int b) {
            return b == 0 ? a : gcd(b, a % b);
        }
    
    展开全文
  • n条直线最多平面分成部分

    千次阅读 2020-11-30 21:08:45
    n条直线最多平面分成部分 1条直线:2部分 2条直线:4部分 3条直线:7部分 4条直线:11部分 … 由此可见,递推公式: 当n = 1时,f[1] = 2 当n > 1时,f[n] = f[n-1] + n 为什么递推公式呢 当n >...

    n条直线最多将平面分成几部分

    1条直线:2部分
    2条直线:4部分
    3条直线:7部分
    4条直线:11部分


    由此可见,有递推公式:
    当n = 1时,f[1] = 2
    当n > 1时,f[n] = f[n-1] + n


    为什么有这个递推公式呢
    当n > 1时,我们每增加一条线,为使分平面的块数最多,我们要将这条直线与之前的n-1条直线全部相交,这样会分的块数最多。同时这样增加的块数就是n。如下图:
    n
    n


    因此根据递推公式有通项公式:f[n] = (n2 + n + 2) / 2

    展开全文
  • 给出2D平面中的n个坐标,计算最多有多少个点在一条直线上条直线可以用斜率表示,即如果已知(x1,y1),(x2,y2)" role="presentation" style="position: relative;">(x1,y1),(x2,y2)(x1,y1),(x2,y2)
  • n条直线最多几个交点

    2020-03-13 18:56:56
    // n条直线最多几个交点 /******************* 减而治之,把第n条直线单独拿出来 1.定义问题,考虑几参数 f(n)表示n条直线 最多交点数 2.找相似性(试探) f(n) = f(n-1) + (n-1) 3.确定递归出口(特殊情况) f(1) ...
  • 对于给定的n个位于同一二维平面上,求最多多少个点位于同一直线上 示例: 解题思路: 方法一: 斜率相同的在同一直线上。 相同位置的也在同一直线上最多多少个点位于同一直线上:斜率相同的...
  • 给定一二维平面平面上有 n 个点,求最多有多少个点在同一条直线上。 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | o ±------------> 0 1 2 3 4 示例 2: 输入: [[1,1],[3,2],[5,3],[4,1],...
  • 对于给定的n个位于同一二维平面上,求最多多少个点位于同一直线上 Givennpoints on a 2D plane, find the maximum number of points that lie on the same straight line. 解题思路:循环遍历每个点,先...
  • n条直线最多平面分为多少部分 一条直线:2块 两条直线:4块 三条直线:7块 四条直线:11块 … 当n==1时: f[1]=2 当n>1时: f[N]=f[N-1]+N 总而言之:f[n]=(n2+n+2)/2{f[n]=(n^2+n+2)/2}f[n]=(n2+n+2)/2
  • 看了一道水题,发现这问题值得记录一下。...那么加一条直线最多与前n条直线有n个交点 于是被它穿过的区域都被一分为二 那么增加的区域数就是穿过的区域 数 也就是这条直线自身被分成的段数 就是n+1
  • 对于给定的n个位于同一二维平面上,求最多多少个点位于同一直线上。 思路:依次遍历所有,计算两的斜率(考虑重合和垂直的特殊情况),非重合斜率相等的则位于同一直线上。采用Map存储斜率,其中...
  • import java.util.*; /* * public class Point { * int x; * int y; * } ...public class Solution... * 计算 二维平面上最多有多少个点位于同一直线上 思路:MAX记录位于同一直线上最多的点数 遍历所有的 ...
  • 【T3】 ...中文题目:在一给定的n个点平面,找到在某条直线上最多的数量。 大致思路: 给了你一系列,这会产生很多条直线,如何确定哪些直线的数量听起来就令人头晕,但简化问题...
  • 任意两个点练成一条直线,判断是否再这条直线上 # 获取两个点 max = 0 for i,ival in enumerate(points): for j,jval in enumerate(points): if i 拿到两个点,获得矢量 # 根据公式 a= (y2-y1)/(x2-x1) a = (jval.y-...
  • 给定一二维平面上n个点,找出同一条直线上的最大点数。 解法: 穷举,注意斜率不适用float作为键,精度损失。 class Solution { public: int gcd(int x,int y) { //求最大公约数 if (y == 0) return x; ...
  • 条直线:2块; 两条直线:4块; 三条直线:7块; 四条直线:11块;... 方法一:当N=1时:f[N]=2;...当N大于1时,f[N]=f[N-1]+N。...平面上有n个X型不明物体,使得划分形成的平面尽量多  公式: f=N(2N+1)+1。  ...
  • 1+n(n+1)/2
  • 最多有多少个点在同一条直线上

    千次阅读 2017-07-29 21:17:54
    给出二维平面上n个点,求最多有多少在同一条直线上。 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3)。 一条直线上点最多有3。 import java.util.HashMap; import java.util.Map; import java.util....
  • 固定任意两端,确定一条直线,依次取出剩下的m-2个点,若在直线则计数加一。 【适合考场作答】 #include <stdio.h> #include <stdlib.h> #define maxSize 1000 typedef struct { float x; ...
  • 给出二维平面上n个点,求最多有多少在同一条直线上。 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3)。 思路借助辅助二维数组,存储每两之间的斜率和截距。代码# Definition for a point. # class ...
  • 给出二维平面上n个点,求最多有多少在同一条直线上。 样例:给出4个点:(1, 2), (3, 6), (0, 0), (1, 3)。一条直线上点最多有3。 算法思想:在不在一条直线上,关键两之间的斜率是否相同。开始...
  • 题目:对于给定的n个位于同一二维平面上,求最多多少个点位于同一直线 理解: 1.首先明白这道题的解题思路应该是进行穷举 2.其次是如何判断多个点都在一条直线上,那就是计算斜率,如果一个点和多个点计算...
  • ##include<stdio.h> int main() { int a[100010]={0,2};/*数字n从1开始*/ int n,i; scanf("%d",&n);... /*划出第n条线后交点数多了n-1,平面数多了n-1+1*/ } printf("%d\n",a[n]...
  • 给出二维平面上n个点,求最多有多少在同一条直线上。 样例: 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3)。 一条直线上点最多有3。 思想: 利用map#ifndef C186_H #define C186_H #include #include #...
  • 最多有多少个点在一条直线上

    千次阅读 2015-09-14 17:15:32
    最多有多少个点在一条直线上
  • 思路对输入的,两两组合求取斜率,这样可能会出现某一斜率对应多对。然后对属于同一斜率的多对,当成一幅图,求取连通分支数。这里对对属于同一斜率的多对...那么实际只有两条直线,(1,1),(2,2),(3,3)是连

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,288
精华内容 3,715
关键字:

平面上有n个点最多几条直线