LeetCode---3.Max Points on a Line

题目链接:https://oj.leetcode.com/problems/max-points-on-a-line/

解题思路:

任取一点,求该点与其他所有点的斜率,拥有相同斜率的点处于同一直线上,计算这些点的数量。遍历所有的点,排序得出最大的点数。

代码:

#ifndef MAXPOINTONLINE_H_
#define MAXPOINTONLINE_H_

#include "header.h"

#pragma once

const double INF = 210000000;

struct Point {
	int x;
	int y;
	Point() : x(0), y(0) {}
	Point(int a, int b) : x(a), y(b) {}
};


class MaxPointOnLine
{
public:
	int maxPoints(vector<Point> &points) {
		max_num = 1;
		int same_point = 0;
		vector<Point>::iterator iteri;
		vector<Point>::iterator iterj;
		if (points.size() <= 2) {
			return points.size();
		}
		for (iteri = points.begin(); iteri != points.end(); iteri ++) {
			Point p = *iteri;
			k.clear();
			same_point = 0;
			for (iterj = iteri + 1; iterj != points.end(); iterj ++) {
				if (iteri->x == iterj->x) {
					if (iteri->y == iterj->y) {
						same_point++;
					}
					else {
						k.push_back(INF);
					}
					
				}
				else {
					k.push_back(double(iteri->y - iterj->y) / (iteri->x - iterj->x));
				}
			}
			int count = 1;
			if (k.size() == 0) {
				count += same_point;
				max_num = (max_num < count) ? count : max_num;
			}
			else if (k.size() == 1) {
				count += (same_point+1);
				max_num = (max_num < count) ? count : max_num;
			} 
			else if( k.size() > 1){
				std::sort(k.begin(), k.end(), compare);
				vector<double>::iterator iter;
				for ( iter = k.begin(); iter < k.end()-1; iter++) {
					if (*iter == *(iter + 1)) {
						count++;
					}
					else {
						count += (same_point + 1);
						max_num = (max_num < count) ? count : max_num;
						count = 1;
					}
				}
				if (count > 1) {
					count += (same_point + 1);
					max_num = (max_num < count) ? count : max_num;
				}
			}
		}
		return max_num;
	}
private:

	static bool compare(const double& c1, const double& c2) {
		return c1 < c2;
	}
	vector<double> k;
	int max_num;
};


#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值