[演算法相關]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每日一題
- 973-最接近原點的 K 個點
- 演算法相關演算法
- 找到k個最接近x的元素
- leetcode 658.找到K個最接近的元素 JavaLeetCodeJava
- K8S容災方案的五個關鍵點K8S
- 方法相關
- 《原神》事件的三個反常點事件
- 關於BP演算法的一點理解演算法
- 973. K Closest Points to Origin(Leetcode每日一題-2020.11.09)LeetCode每日一題
- 雙指標法相關的題指標
- 使用Kubernetes的5個關鍵點!
- K個節點翻轉連結串列
- 用一個儘可能高效的演算法,查詢單向連結串列(有頭結點)中倒數第k個位置上的結點演算法
- [1483. 樹節點的第 K 個祖先] 【路徑】
- 二叉搜尋樹的第 k 個結點
- 關於range的一個知識點
- 8 大內部排序演算法相關及其java實現排序演算法Java
- 連結串列倒數第k個結點
- 【演算法】HashMap相關要點記錄演算法HashMap
- k8s系列--node(k8s節點介紹,新增節點,移除節點)K8S
- 佛說法相,即非法相,是名法相
- 連結串列中的節點每k個一組翻轉
- 10,函式和方法相關的東西函式
- JZ-062-二叉查詢樹的第 K 個結點
- 關於Quick.logger的一點點補充UI
- 關於ORACLE大型事務回滾的幾個點Oracle
- 避免專案失敗的六個基本關注點
- 關於難點的思考
- k8s知識點K8S
- 關於網站設計的一點點討論網站
- 演算法學習之旅,終點亦是起點演算法
- ERP實施的關鍵點,你的企業做到幾個?
- PFLD:簡單高效的實用人臉關鍵點檢測演算法演算法
- JS 總結之關於 this 應該知道的幾個點JS
- 關於《明日方舟》單局優點的一個思考
- 線上教育平臺開發的幾個關鍵點
- 盤點Linux系統最常用的4個關機命令!Linux