码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 447. Number of Boomerangs; 149. Max Points on a Line

时间:2018-08-30 11:01:16      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:复习   hash   def   struct   tco   nbsp   table   不同   辗转相除法   

Boomerang 回旋镖的意思,本题意思是寻找 abc的点对,使得ab,ac距离相等。

一个循环固定a,计算其余的点到a的距离,简历一个hashtable,保存对应距离的点的个数。

如果有n个点到a距离相等,那么一共有 P_n^2 种可能 (题目中提到不同顺序算多种)

class Solution {
public:
    int numberOfBoomerangs(vector<pair<int, int>>& points) {
        int res=0;
        for (int i=0;i<points.size();++i){
            unordered_map<int,int> count; // <dis^2, numbers>
            for (int j=0;j<points.size();++j){
                if (i==j) continue;
                int dx=points[i].first-points[j].first;
                int dy=points[i].second-points[j].second;
                ++count[dx*dx+dy*dy];
            }
            for (auto i:count){ // P_n^2 since order matters
                int n=i.second;
                res += n*(n-1);
            }
        }
        return res;
    }
};

 

149. Max Points on a Line

思路和上一题一样,固定一个点,计算其余的点与当前的斜率,建立hashtable保存相同的斜率数目。

本题j循环从i+1开始就行了,不用重复计算。注意,与x轴垂直的两点是没法计算斜率的,需要单独计算;此外,还要考虑重复的点的问题。

这道题还有一个坑,由于double的精度问题,用 <double,int> 来开hashtable 不能ac,因此可以用 <dy/gcd, dx/gcd> 来保存斜率,用这种方法的话 与x轴垂直的点也可以包括在内。

顺便复习一下辗转相除法的写法。

/**
 * 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) {
        int res=0;
        for (int i=0;i<points.size();++i){
            map<pair<int,int>,int> count; // <slope, num>
            int vertical=0;
            int depulicate=1; // one is for itself
            for (int j=i+1;j<points.size();++j){
                if (points[i].x==points[j].x && points[i].y==points[j].y) {++depulicate; continue;}
                //if (points[i].x==points[j].x) {++vertical; continue;} //can be omitted now
                int dy=points[i].y-points[j].y;
                int dx=points[i].x-points[j].x;
                int gcd=GCD(dx,dy);
                ++count[{dy/gcd, dx/gcd}];
            }
            for (auto x:count){
                res = max(res, x.second+depulicate);
            }
            //res = max(res,vertical+depulicate);
            res = max(res, depulicate);
        }
        return res;
    }
    
    int GCD(int a, int b){
        return b==0? a : GCD(b,a%b);
    }
};

 

LeetCode 447. Number of Boomerangs; 149. Max Points on a Line

标签:复习   hash   def   struct   tco   nbsp   table   不同   辗转相除法   

原文地址:https://www.cnblogs.com/hankunyan/p/9557875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!