[演算法相關]973. 最接近原點的 K 個點

Binbin_Sun發表於2020-11-11

好久沒刷題了, 搞起啊,不然腦袋要廢了…

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};
    }
};

相關文章