在这个问题中,我们将从给定的 N 个点中找到 2D 平面中距离原点最近的 K 个点。
我们可以使用标准的欧氏距离公式来计算原点到每个给定点之间的距离。之后,我们可以将有距离的点存储到数组中,根据距离对数组进行排序,并取前K个点。
然而,我们还可以使用优先队列根据点与原点的距离来存储二维点。之后,我们可以从队列中出队K次。
问题陈述− 我们在二维平面上给定了N个点。我们需要找到离平面原点最近的K个点。
注意- 将欧几里得距离视为原点和平面给定点之间的距离。
示例
输入
points = {{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}}, K = 4
输出
{2,1} {2,-2} {0,3} {-5,1}
Explanation − 这里是每个点到原点的欧几里得距离。
(2, −2) −> sqrt(8)
(−5, 1) −> sqrt(26)
(2, 1) -> sqrt(5)
(0, 3) −> sqrt(9)
(6, 0) -> sqrt(36)
(5, 5) -> sqrt(50)
(4, 9) -> sqrt(97)
因此,4 个最近的点是 {2,1} {2,−2} {0,3} {−5,1}。
输入
points = {{1, 2}, {2, 1}, {-2, 1}, {1, -2}} K = 2
输出
{1, 2}, {2, 1}
Explanation − 所有点到原点的距离都是相同的。因此,我们可以将任意2个点作为输出打印。
输入
points = {{1, 3}, {6, 7}, {1, 1}, {1, 0}} K = 4
输出
{1, 0}, {1, 1}, {1, 3}, {6, 7}
解释− K 等于给定点。因此,我们需要打印所有点。
方法一
在这种方法中,我们将使用 sort() 方法对数组进行排序。此外,我们将使用比较器函数根据点与原点的距离对点进行排序。之后,我们打印排序数组的前 K 个元素。
算法
步骤 1 − 使用sort()方法对列表进行排序,并将distComparator()函数作为第三个参数传递。
第二步− 定义distComparator()函数来比较给定点的距离。该函数以p和q对作为参数。
步骤 2.1 − 获取点 p 到原点的距离并将其存储在 dist_p 中。
步骤 2.2 − 将点 q 到原点的距离存储在 dist_q 变量中。
步骤 2.3 − 如果 dist_p 小于 dist_q,则返回 true。否则,返回 false。
第 3 步- 遍历数组,并打印数组的前 K 个点。
示例
#include <bits/stdc++.h> using namespace std; bool distComparator(const pair<int, int> &p, const pair<int, int> &q) { int dist_p = p.first * p.first + p.second * p.second; int dist_q = q.first * q.first + q.second * q.second; return dist_p < dist_q; } vector<pair<int, int>> findKPoints(vector<pair<int, int>> points, int n, int k) { vector<pair<int, int>> res_points; sort(points.begin(), points.end(), distComparator); // Get the first K points for (int p = 0; p < k; p++) { res_points.push_back({points[p].first, points[p].second}); } return res_points; } int main() { int k = 4, n = 7; vector<pair<int, int>> points{{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}}; vector<pair<int, int>> res = findKPoints(points, n, k); cout << "The " << k << " closest points from origin are - "; for (int p = 0; p < k; p++) { cout << "{" << res[p].first << "," << res[p].second << "} "; } return 0; }
输出
The 4 closest points from origin are - {2,1} {2,-2} {0,3} {-5,1}
时间复杂度 - 对数组进行排序的时间复杂度为O(NlogN)。
空间复杂度 - O(N) 用于对数组进行排序。
方法二
在这种方法中,我们将使用优先级队列来插入点。此外,我们将使用比较器函数和优先级队列来根据距原点的最短距离来存储点。
算法
步骤 1 − 定义‘res_points’列表,用于存储K个最近的点。
步骤 2- 定义优先级队列。这里,‘pair
第三步− 定义cmp()函数来比较两个点到原点的欧几里得距离。
步骤 3.1 - 根据 a 点到原点的距离大于 b 点到原点的距离,返回布尔值。
第 4 步- 将数组的每个元素插入优先级队列。
第5步− 从队列中弹出前K个元素,并将它们存储在res_points列表中。
第 6 步− 返回点的 res_points 列表。
示例
#include <bits/stdc++.h> using namespace std; vector<pair<int, int>> findKPoints(vector<pair<int, int>> points, int n, int k) { vector<pair<int, int>> res_points; // Custom comparator to compare points based on their distance from the origin auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) { return (a.first * a.first + a.second * a.second) > (b.first * b.first + b.second * b.second); }; // Use the custom comparator in the priority_queue priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> p_que(cmp); for (int p = 0; p < n; p++) { // Inserting points in a queue p_que.push(points[p]); } // Get first K points while (k--) { auto temp = p_que.top(); res_points.push_back(temp); p_que.pop(); } return res_points; } int main() { int k = 4, n = 7; vector<pair<int, int>> points{{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}}; vector<pair<int, int>> res = findKPoints(points, n, k); cout << "The " << k << " closest points from origin are - "; for (int p = 0; p < k; p++) { cout << "{" << res[p].first << "," << res[p].second << "} "; } return 0; }
输出
The 4 closest points from origin are - {2,1} {2,-2} {0,3} {-5,1}
时间复杂度 - O(N*logN) 将 N 个元素插入优先级队列。这里,N是总点数。
空间复杂度 - 在优先级队列中存储点的 O(N)。
优先队列使用堆数据结构。因此,插入和删除元素只需O(logN)的时间。这两种方法都需要相同的内存和时间。然而,第二种方法更高效,因为它使用了堆数据结构。
以上是使用优先队列找到离原点最近的K个点的详细内容。更多信息请关注PHP中文网其他相关文章!

C#适合需要高开发效率和跨平台支持的项目,而C 适用于需要高性能和底层控制的应用。1)C#简化开发,提供垃圾回收和丰富类库,适合企业级应用。2)C 允许直接内存操作,适用于游戏开发和高性能计算。

C 持续使用的理由包括其高性能、广泛应用和不断演进的特性。1)高效性能:通过直接操作内存和硬件,C 在系统编程和高性能计算中表现出色。2)广泛应用:在游戏开发、嵌入式系统等领域大放异彩。3)不断演进:自1983年发布以来,C 持续增加新特性,保持其竞争力。

C 和XML的未来发展趋势分别为:1)C 将通过C 20和C 23标准引入模块、概念和协程等新特性,提升编程效率和安全性;2)XML将继续在数据交换和配置文件中占据重要地位,但会面临JSON和YAML的挑战,并朝着更简洁和易解析的方向发展,如XMLSchema1.1和XPath3.1的改进。

现代C 设计模式利用C 11及以后的新特性实现,帮助构建更灵活、高效的软件。1)使用lambda表达式和std::function简化观察者模式。2)通过移动语义和完美转发优化性能。3)智能指针确保类型安全和资源管理。

C 多线程和并发编程的核心概念包括线程的创建与管理、同步与互斥、条件变量、线程池、异步编程、常见错误与调试技巧以及性能优化与最佳实践。1)创建线程使用std::thread类,示例展示了如何创建并等待线程完成。2)同步与互斥使用std::mutex和std::lock_guard保护共享资源,避免数据竞争。3)条件变量通过std::condition_variable实现线程间的通信和同步。4)线程池示例展示了如何使用ThreadPool类并行处理任务,提高效率。5)异步编程使用std::as

C 的内存管理、指针和模板是核心特性。1.内存管理通过new和delete手动分配和释放内存,需注意堆和栈的区别。2.指针允许直接操作内存地址,使用需谨慎,智能指针可简化管理。3.模板实现泛型编程,提高代码重用性和灵活性,需理解类型推导和特化。

C 适合系统编程和硬件交互,因为它提供了接近硬件的控制能力和面向对象编程的强大特性。1)C 通过指针、内存管理和位操作等低级特性,实现高效的系统级操作。2)硬件交互通过设备驱动程序实现,C 可以编写这些驱动程序,处理与硬件设备的通信。

C 适合构建高性能游戏和仿真系统,因为它提供接近硬件的控制和高效性能。1)内存管理:手动控制减少碎片,提高性能。2)编译时优化:内联函数和循环展开提升运行速度。3)低级操作:直接访问硬件,优化图形和物理计算。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版