Max Points on a line ,在二维平面寻找共线的最多点

这篇博客探讨了在2D平面上找到最多共线点的问题。当n <= 2时,答案就是n。若n > 2,可以通过计算三点斜率来判断是否共线。博主提供了一个C++程序来解决这个问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题描述如下:

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

给定2维平面的N个点,找出共线的最多的点。

分析如下,初中知识,任何不相同的两点确定一条直线。

特殊情况,如果n <=2,共线的点n。

如果n>2怎么办呢? 给定三个点<x1, y1>, <x2, y2>, <x3, y3>,如果共线,我们会发现slop=(y2 -y1)/(x2-x1) = (y3 - y1)/(x3 - x1)。 请注意特殊情况如果三个点x值相同。

一下是c++程序.

/**
 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */
class Solution {
public:
    int maxPoints(vector<Point> &points) {
        //special case
        if(points.size() <= 2) return points.size();
        
        int i, j, repeat, spc, max = 0;
        map<double, int> stat;
        for(i = 0; i < points.size(); i++){
            //fix each point, find the point
            repeat = 0; 
            spc = 0;
            stat.clear();
            Point point = points[i];
            
            for(j = 0; j < points.size(); j++){
                //if(i == j) continue;
                Point p2 = points[j];
                if(point.x == p2.x){
                    if(point.y == p2.y) repeat++; //also add self
                    else spc++;
                }else{
                    stat[(double)(p2.y-point.y)/(p2.x - point.x)] ++;
                }
            }
            for(map<double,int>::iterator begin = stat.begin(); begin != stat.end(); begin++){
                if(begin->second > spc) spc = begin->second;
            }
            if(max < (spc + repeat))max = spc + repeat;
        }
        return max;
    }
};



### 使用 MATLAB 绘制 2D 曲线的外轮廓 在 MATLAB 中绘制二维线的外轮廓可以通过多种方式实现。以下是几种常见的方法及其技巧: #### 方法一:手动勾勒外轮廓 可以使用 `insert` -> `shape` -> `line` -> `arbitrary polygon` 的方式进行自由曲线的手动勾画[^1]。这种方法适用于简单的几何形状,通过沿着目标对象的边界逐描绘形成封闭区域。虽然此过程较为耗时,但它能够提供高度定制化的结果。 #### 方法二:基于轮廓波变换提取边缘 对于复杂的图像或数据集中的外部轮廓提取,可以采用 **轮廓波变换 (Contourlet Transform)** 来捕捉图像中的边缘特征[^2]。具体步骤包括加载所需工具箱并应用相应的算法来识别和突出显示物体的主要边界。这种技术特别适合于高分辨率图片以及具有精细结构的数据源。 ```matlab % 假设已安装 Contourlet 工具包 load('your_image.mat'); % 加载输入图像文件 coeffs = contourlet_transform(your_image); % 执行变换操作获取系数矩阵 edges = abs(coeffs(end,:,:)); % 提取最后一层细节分量作为边沿指示器 imshow(edges, []); % 显示检测到的边缘信息 ``` #### 方法三:利用 plot 函数标记特定位置 如果只需要标注某些特殊位上的坐标,则可以直接运用基本绘图命令完成任务。例如,在给定时间序列 t 和对应数值数组 x 下面的例子展示了如何分别用红色菱形 ('rp') 及黑色星号 ('k*') 表明第40个与第75个样本所在之处[^3]: ```matlab t = linspace(0, pi, 100); x1 = sin(t); figure; plot(t, x1,'b-', 'LineWidth', 1.5); hold on; plot(t(40), x1(40),'rp','MarkerSize',8,'MarkerFaceColor',[1 0 0]); plot(t(75), x1(75),'k*','MarkerSize',10,'MarkerEdgeColor','black'); title('Sine Wave with Marked Points'); xlabel('Time(s)'); ylabel('Amplitude'); legend('Sin Curve','Point at index 40','Point at index 75'); grid on; axis tight; hold off; ``` #### 方法四:统计学手段辅助界定范围 当面对大量随机分布样例时,可能希望通过计算其均值 ± n倍标准偏差区间内的所有成员构成近似外包络线。此时便可调用内置功能如 mean() 计算中心趋势指标 std() 测度离散程度从而决定上下限阈值[^4]. ```matlab data = randn(1e3,1)*2 + 5; mu = mean(data); sigma = std(data); upperBound = mu + sigma * 3; lowerBound = mu - sigma * 3; histogram(data,50,'Normalization','pdf'); [x,y]=fimplicit(@(X,Y)(Y-(normpdf(X,mu,sigma))),[-Inf Inf lowerBound upperBound],'r--'); set(gca,'FontSize',12); text(mu+.5,normpdf(mu,mu,sigma)+.05,['\mu=',num2str(mu)],'HorizontalAlignment','center') text(mu-.5,max(normpdf([mu-3*sigma mu],mu,sigma)),'\pm \sigma','color','red',... 'FontWeight','bold','Interpreter','latex') ``` 以上介绍了四种不同场景下生成二维线外轮廓的方法。每种都有各自适用场合,请依据实际需求选取最合适的方案实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值