按顺序做好难坚持,决定开始做每日一题了,希望能坚持下去。
解法一:是我一开始想到的解法,就是维护一个长度为K的数组,每个点更新一次。
设点的个数为N,复杂度为O(KN)
from math import sqrt
class Solution:
def kClosest(self, points: List[List[int]], K: int) -> List[List[int]]:
dists, result = [], []
for point in points:
a, b = point
dist = sqrt(a*a + b*b)
if len(dists) > 0 and dist < dists[-1]:
for i in range(len(dists)):
if dist < dists[i]:
dists.insert(i, dist)
result.insert(i, point)
break
elif len(dists) < K:
dists.append(dist)
result.append(point)
if len(dists) > K:
result.pop()
dists.pop()
return result
解法二:优先队列
维护一个有序小数组,最应该想到的就是优先队列。。草率了。堆还是用c++更舒服一点
另外,用整数存距离(即不做平方根)要比浮点数更快一些。
此算法可以实现O(NlogK)复杂度,在每一步push加pop就行,然而在这个题中,由于数据量小,时间要求严格,不加pop也是O(NlogK),其实加pop才是严格的最小时间复杂度。
class Solution {
public:
struct node
{
vector<int> point;
int dist;
node(vector<int> point, int dist)
{
this->point = point;
this->dist = dist;
}
};
struct cmp
{
bool operator () (node a, node b)
{
return a.dist > b.dist;
}
};
vector<vector