LeetCode-Max Points On a Line題解

一. 題意描述數據結構

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

二. 題目分析this

看到這道題想到的第一種方法是暴力枚舉法,時間複雜度爲O(n3),顯然是不夠好的。code

因而咱們須要進行一些優化,注意到對於一條直線上的任意兩點,他們連線的斜率是相同的。因而咱們能夠算出指定點到其餘全部點的斜率,先使得包含指定點的直線上點數最多,這個過程當中能夠創建斜率和直線上點數的一一對應關係,能夠利用STL中的map模板。blog

而後再將包含各個點的直線上點的數量進行比較,獲得max points on a line.數學

須要注意的地方:hash

1.就像奇怪的高中數學解析幾何題告訴咱們的同樣,使用斜率就必定要考慮斜率不存在的狀況。it

2.斜率不存在的狀況還有兩種,一種是兩個點根本就是同樣的,另外一種就是兩個點只有橫座標同樣,這兩種狀況都須要特殊判斷。io

代碼以下:編譯

/**
 * 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) {
          if(points.size() <= 2)
			return points.size();
		double k = 0;
		int maxPoints = 0;            //max points on a line
		int maxPointsTemp = 0;          //包含特定點的max points on a line
		int samePoints = 0;            //特定點重複了幾回,沒重複過算一次
		int sameXPoints = 0;            //和特定點橫座標相同但不重合的點有幾個
		map<double, int> Map;
		for(int i = 0; i < (points.size() - 1); i++)
		{
			maxPointsTemp = 0;
			samePoints = 1;          //1是i點自己
			sameXPoints = 0;
			Map.clear();
			for(int j = (i + 1); j < points.size(); j++)
			{
				if(points[j].x == points[i].x)
				{
					if(points[j].y == points[i].y)        //重合
						samePoints++;
					else                        //橫座標相同但不重合
						sameXPoints++;
				}
				else
				{
					k = (double)(points[j].y - points[i].y) / (points[j].x - points[i].x);    //求斜率
					if(Map.find(k) != Map.end())                  
						Map[k]++;
					else
						Map[k] = 1;
				}
			}
			map<double, int>::iterator it, iend;
			iend = Map.end();
			for(it = Map.begin(); it != iend; it++)
			{
				if(maxPointsTemp < it->second)
					maxPointsTemp = it->second;
			}
			if(maxPointsTemp < sameXPoints)
				maxPointsTemp = sameXPoints;
			maxPointsTemp += samePoints;                  //獲得包含特定點的max points on a line,包含自身和重複點
			if(maxPoints < maxPointsTemp)
				maxPoints = maxPointsTemp;                //獲得max points on a line
		}
		return maxPoints; 
    }
};

  最後是在實際寫代碼過程當中遇到的一些問題:

1. 最開始使用的是數據結構是哈希表,但寫完以後再Leetcode上提交顯示編譯錯誤,報錯Line 21: ‘hash_map’ was not declared in this scope。

額感受必定是我哪兒寫錯了= =

2.有一個bug調了挺長時間,發現是

k = (double)(points[j].y - points[i].y) / (points[j].x - points[i].x);

  這一句一開始忘了進行強制類型轉換,感受之後寫代碼的時候一些細節仍是要更加註意。

 

最後,謝謝收看~

相關文章
相關標籤/搜索