[演算法相關]973. 最接近原點的 K 個點
好久沒刷題了, 搞起啊,不然腦袋要廢了…
https://leetcode-cn.com/problems/k-closest-points-to-origin/
我們有一個由平面上的點組成的列表 points。需要從中找出 K 個距離原點 (0, 0) 最近的點。
(這裡,平面上兩點之間的距離是歐幾里德距離。)
你可以按任何順序返回答案。除了點座標的順序之外,答案確保是唯一的。
示例 1:
輸入:points = [[1,3],[-2,2]], K = 1
輸出:[[-2,2]]
解釋:
(1, 3) 和原點之間的距離為 sqrt(10),
(-2, 2) 和原點之間的距離為 sqrt(8),
由於 sqrt(8) < sqrt(10),(-2, 2) 離原點更近。
我們只需要距離原點最近的 K = 1 個點,所以答案就是 [[-2,2]]。
示例 2:
輸入:points = [[3,3],[5,-1],[-2,4]], K = 2
輸出:[[3,3],[-2,4]]
(答案 [[-2,4],[3,3]] 也會被接受。)
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/k-closest-points-to-origin
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解法1: 該方法超時(不可用)
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
struct PointsStr{
vector<int> pts;
long long dis;
};
int comparerVec(const void *a, const void *b ) {
PointsStr pointA = *(PointsStr*)a;
PointsStr pointb = *(PointsStr*)b;
return pointA.dis - pointb.dis;
}
class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
if (points.empty() || K <= 0) return {};
vector<PointsStr> pointsRes;
vector<vector<int>> res;
for (size_t i = 0; i < points.size(); i++) {
PointsStr ptStr;
ptStr.pts = points[i];
ptStr.dis = points[i].front() * points[i].front() + points[i].back() * points[i].back();
//pointsRes.push_back(ptStr);
if (i < K ){
pointsRes.push_back(ptStr);
} else {
qsort(pointsRes.data(), pointsRes.size(), sizeof(PointsStr), comparerVec);
if(ptStr.dis < pointsRes.back().dis){
pointsRes[pointsRes.size() - 1] = ptStr;
}
}
}
for (size_t i = 0; i < K && i < points.size(); i++) {
//printf(" %lld\n", pointsRes[i].dis);
res.push_back(pointsRes[i].pts);
}
return res;
}
};
解法二: 先新增資料後排序
#include<vector>
#include<deque>
#include<queue>
#include<algorithm>
struct PointsStr{
vector<int> pts;
long long dis;
};
int comparerVec(const void *a, const void *b ) {
PointsStr pointA = *(PointsStr*)a;
PointsStr pointb = *(PointsStr*)b;
return pointA.dis - pointb.dis;
}
class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
if (points.empty() || K <= 0) return {};
vector<PointsStr> pointsRes;
vector<vector<int>> res;
for (size_t i = 0; i < points.size(); i++) {
PointsStr ptStr;
ptStr.pts = points[i];
ptStr.dis = points[i].front() * points[i].front() + points[i].back() * points[i].back();
//pointsRes.push_back(ptStr);
if (i < K ){
pointsRes.push_back(ptStr);
} else {
qsort(pointsRes.data(), pointsRes.size(), sizeof(PointsStr), comparerVec);
if(ptStr.dis < pointsRes.back().dis){
pointsRes[pointsRes.size() - 1] = ptStr;
}
}
}
for (size_t i = 0; i < K && i < points.size(); i++) {
res.push_back(pointsRes[i].pts);
}
return res;
}
};
解法2-精簡版:
class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>& v) {
return u[0] * u[0] + u[1] * u[1] < v[0] * v[0] + v[1] * v[1];
});
return {points.begin(), points.begin() + K};
}
};
相關文章
- LeetCode每日一題--973. 最接近原點的 K 個點LeetCode每日一題
- 找到k個最接近x的元素
- 演算法相關演算法
- K8S容災方案的五個關鍵點K8S
- 模型的一個點顯示在原點模型
- leetcode 658.找到K個最接近的元素 JavaLeetCodeJava
- HTTPS中的加密演算法相關概念HTTP加密演算法
- 聚類分析--k中心點演算法聚類演算法
- 方法相關
- 運動目標檢測演算法相關概念演算法
- 關於BP演算法的一點理解演算法
- K個節點翻轉連結串列
- 雙指標法相關的題指標
- 8 大內部排序演算法相關及其java實現排序演算法Java
- 用一個儘可能高效的演算法,查詢單向連結串列(有頭結點)中倒數第k個位置上的結點演算法
- 關於range的一個知識點
- 廣告效果分析的3個關鍵點
- 二叉樹節點個數,葉子個數,第K層個數,最低公共節點二叉樹
- [1483. 樹節點的第 K 個祖先] 【路徑】
- 關於latch的一點點理解
- k8s系列--node(k8s節點介紹,新增節點,移除節點)K8S
- 【演算法】HashMap相關要點記錄演算法HashMap
- 關於redo的幾個小知識點
- 關於PHP 的一點點小分享PHP
- TRW2k一點點小小的經驗。 (290字)
- oracle 還原點Oracle
- 10,函式和方法相關的東西函式
- 程式設計師保值的五個關鍵點程式設計師
- 關於模式爭論的一點點思考模式
- 基於Spring的MVC的幾個關鍵點SpringMVC
- SQL 跟蹤方法相關介紹SQL
- k8s知識點K8S
- JZ-062-二叉查詢樹的第 K 個結點
- 線上教育平臺開發的幾個關鍵點
- 關於ORACLE大型事務回滾的幾個點Oracle
- 避免專案失敗的六個基本關注點
- 一場成功的技術面試的幾個關鍵點面試
- 關於難點的思考