前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

作者头像
Michael阿明
发布2020-07-13 15:36:30
3340
发布2020-07-13 15:36:30
举报

1. 题目

给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]。 请找出一条直线,其通过的点的数目最多

设穿过最多点的直线所穿过的全部点编号从小到大排序的列表为S,你仅需返回[S[0],S[1]]作为答案 若有多条直线穿过了相同数量的点,则选择S[0]值较小的直线返回,S[0]相同则选择S[1]值较小的直线返回。

代码语言:javascript
复制
示例:
输入: [[0,0],[1,1],[1,0],[2,0]]
输出: [0,2]
解释: 所求直线穿过的3个点的编号为[0,2,3]

提示:
2 <= len(Points) <= 300
len(Points[i]) = 2

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-line-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 暴力法,固定一个点,遍历所有剩余的
  • 采用嵌套的哈希map,第一层key存储斜率,第二层key存储截距,value为点的set集合(存储下标)
  • 斜率不存在,单独再开一个哈希表,key为与 x 轴的截距,value为点集合
  • 遍历所有集合找最多的
  • 对相等长度的点集合排序,取出题目要求的最小的下标的
  • 时间复杂度 O(n2)O(n^2)O(n2)
代码语言:javascript
复制
class Solution {
public:
    vector<int> bestLine(vector<vector<int>>& points) {
    	int i, j, g, dx, dy, maxCount = 0, n = points.size();
    	double k, b;
    	unordered_map<double,unordered_map<double,set<int>>> m;//k,b,points
    	unordered_map<double,set<int>> v;//x轴截距,斜率不存在时的集合
        vector<set<int>> ans;
    	for(i = 0; i < n-1; ++i)
    	{
    		for(j = i+1; j < n; ++j)
    		{
    			dx = points[j][0]-points[i][0];
    			dy = points[j][1]-points[i][1];
    			if(dx==0)//斜率不存在
    			{
    				if(v[double(points[i][0])].empty())
    					v[double(points[i][0])].insert(i);
    				v[double(points[i][0])].insert(j);
    			}
    			else
    			{
    				k = double(dy)/dx;
    				b = double(points[i][1])-points[i][0]*k;
    				if(m[k][b].empty())
    					m[k][b].insert(i);
    				m[k][b].insert(j);
    			}
    		}
    	}
    	for(auto& mi : m)
    	{
    		for(auto& mii : mi.second)
    		{
                if(mii.second.size() > maxCount)
                {
                    maxCount = mii.second.size();
                    ans.clear();
                    ans.push_back(mii.second);
                }
                else if(mii.second.size() == maxCount)
                    ans.push_back(mii.second);
    		}
    	}
    	for(auto& vi : v)
    	{
    		if(vi.second.size() > maxCount)
			{
				maxCount = vi.second.size();
                ans.clear();
				ans.push_back(vi.second);
			}
            else if(vi.second.size() == maxCount)
                ans.push_back(vi.second);
    	}
        sort(ans.begin(),ans.end(),[&](auto a, auto b){
            auto it1 = a.begin(), it2 = b.begin();
            if(*it1 == *it2)
                return *(++it1) < *(++it2);
            return *it1 < *it2;
        });
        auto it = ans[0].begin();
    	return {*it,*(++it)};
    }
};

660 ms 117.7 MB

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档