在一个二维平面上找到离固定点最近的k个点位置
2017-10-23 18:19
330 查看
问题描述
/** 给定一些 points 和一个 origin, 从points中找出k个离origin最近的点,按照距离从小到大返回
* 如果有两个点有相同距离,按照x值进行排序,如果x值相等,按照y值进行排序
*
* 如果是静态数据,数据量不是特别多的话,直接做个排序就可以了
* 如果是动态数据的话,维护一个最小堆
*/
代码
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <queue> typedef std::pair<int, int> P; struct LessCmp { bool reverse; LessCmp(bool reverse = false): reverse(reverse) {} bool operator()(P &a, P &b) { bool res; double dis1 = a.first * a.first + a.second * a.second, dis2 = b.first * b.first + b.second * b.second; if (fabs(dis1 - dis2) < 1e-6) { if (a.first == b.first) res = a.second < b.second; else res = a.first < b.first; } else res = dis1 < dis2; return reverse ? (!res) : res; } }; /** * 直接排序 */ class Solution1 { public: std::vector<P> getKNearest(std::vector<P> &points, P origin, int k) { // 坐标点进行归一化 for (auto &e : points) { e.first -= origin.first; e.second -= origin.second 9b9e ; } std::sort(points.begin(), points.end(), LessCmp()); if (points.begin() + k >= points.end()) return std::vector<P>(points); return std::vector<P>(points.begin(), points.begin() + k); } }; // 使用最小堆 class Solution2 { public: std::vector<P> getKNearest(std::vector<P> &points, P origin, int k) { typedef std::priority_queue<P, std::vector<P>, LessCmp> Pq_t; Pq_t pq(true); for (auto &e: points) { e.first -= origin.first; e.second -= origin.second; pq.push(e); } std::vector<P> res; for (int i = 0; i < k && !pq.empty(); ++i) { res.push_back(pq.top()); pq.pop(); } return res; } }; int main() { int x[][2] = {{4, 6}, {4, 7}, {4, 4}, {2, 5}, {1, 1}}; std::vector<P> points; for (int i = 0; i < sizeof(x)/sizeof(x[0]); ++i) { points.push_back(P(x[i][0], x[i][1])); } P origin(0, 0); int k = 3; // std::vector<P> ret = Solution1().getKNearest(points, origin, k); std::vector<P> ret = Solution2().getKNearest(points, origin, k); for (auto &e : ret) std::cout << "(" << e.first << ", " << e.second << ") " << std::endl; return 0; }
相关文章推荐
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中,距离最近的两个点间的最小距离
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中,距离最近的两个点间的最小距离。
- 最近距离 已知平面上的若干点的位置,存入一个List中。现在需要计算所有这些点中, 距离最近的两个点间的最小距离。请补全缺失的代码。
- 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 设在数组A中有10个整数 现从键盘中输入一个数 检查该数是否在数组总,若在数组中则输出该书在数组总的位置若从数组中未找到该数 则输出“NOT FOUND!”信息
- 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 给一个由整数构成的排序二叉树, 给定一个整数, 找到二叉树中比它大并且最近它的节点。
- 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 找到一个二维矩阵中所有包含0的,并且把0元素所在行与列全部转换成0的算法!
- Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置
- 1.找到一个字符串各次出现的位置
- 二维平面上线段与直线位置关系的判定
- 无序数组中找到一个局部最小的位置
- 找到一个二维矩阵中所有包含0的,并且把0元素所在行与列全部转换成0的算法!
- 每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
- 最近由于要用到分隔条,找到了一篇讲原理的, 实现了一个。可以双击缩到左边,可以左右拖动
- 全国计算机等级二级C++第四章习题编程题6 :编写一个函数 char *strfind(char *s, char *t),用于查找字符串t在字符串s中最右边出现的位置,如果没有找到则返回NULL.
- 腾讯2017年实习生编程题目(第二题)----2.算法基础-字符移位 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
- 【剑指Offer-时间效率平衡】在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
- 在数组中找到一个局部最小的位置