1.暴力排序,新建节点类重载小于符号排序。

class Solution {
public:
struct comb{
int index,distance;
comb():index(0),distance(0){}
comb(int a,int b){
index=a;distance=b;
}
bool operator<(const comb& x){
return distance<x.distance;
}
};
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
if(points.size()<=K){
return points;
}
vector<comb> vec(points.size());
for(int i=0;i<points.size();++i){
vec[i]=comb(i,points[i][0]*points[i][0]+points[i][1]*points[i][1]);
}
sort(vec.begin(),vec.end());
vector<vector<int>> res(K);
for(int i=0;i<K;++i){
res[i]=points[vec[i].index];
}
return res;
}
};

其实我是想只对索引数组进行排序的,但sort的重载小于符函数不大好写,因为要用到points数组,没法加到函数参数里,所以就先这样写

2.快排划分。想到没必要全排序,因为只需要前k个。若当前划分好的小于K个,到右边再找。若等于K个或者K-1个,则输出。否则到左边缩小划分继续找,O(N logN)时间(大概是这个,具体不会算)。

class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int K)
{
int siz = points.size();
if(K==siz)
{
return points;
}
vector<int> indexes(siz);
for (int i = 0; i < siz; ++i)
{
indexes[i] = i; //存索引
}
vector<vector<int>> res;
quicksort(indexes, points, 0, siz - 1, K, res);
return res;
}
void quicksort(vector<int>& indexes, vector<vector<int>>& points, int le, int ri, const int& K, vector<vector<int>>& res)
{
if (res.size() or le > ri)
{
return;
}
int mi = partition(indexes, points, le, ri, K);
if (mi == K - 1)
{
res.resize(K);
for (int i = 0; i < K; ++i)
{
res[i] = points[indexes[i]];
}
return;
}
else if (mi < K - 1) //目前找到最小的mi+1个,但mi+1<k,所以还要到右半边找k-mi+1个
{
quicksort(indexes, points, mi + 1, ri, K, res);
}
else //mi>k-1,则mi+1>k,左半边元素大于K个
{
quicksort(indexes, points, le, mi - 1, K, res);
}
}
int partition(vector<int>& indexes, vector<vector<int>>& points, int le, int ri, const int& K)
{
if(le==ri)
{
return le;
}
int p = le + rand() % (ri - le + 1);
int temp = indexes[p];
indexes[p] = indexes[ri];
indexes[ri] = temp;
int i = le - 1, j = le;
while (j < ri)
{
if (check(indexes[j], indexes[ri], points)) //索引j对应的点离原点比基准点近
{
int temp = indexes[j];
indexes[j] = indexes[++i];
indexes[i] = temp; //i先+1,再交换i、j处的索引值
}
++j;
}
temp = indexes[i + 1];
indexes[i + 1] = indexes[ri];
indexes[ri] = temp;
return i + 1; //返回基准数位置
}
bool check(int i, int j, vector<vector<int>>& points) //i、j为points的索引
{
if (abs(points[i][0]) < abs(points[j][0]) and abs(points[i][1]) < abs(points[j][1]))
{
return true;
}
return pow(points[i][0], 2) + pow(points[i][1], 2) < pow(points[j][0], 2) + pow(points[j][1], 2);
}
};

3.堆排。考虑到要求的前k个元素并不要求有序,故考虑建长度K的大顶堆,将所有点依次加入直到堆满。之后若当前元素比堆顶还大,丢弃该元素不用。最后留下来的K个就是最小的K个。这K个不是完全有序的,但确实是最小的K个。O(N logK)时间。

class Solution {
public:
static bool cmp(const vector<int>& a, vector<int>& b) {
return a[0] * a[0] + a[1] * a[1] < b[0] * b[0] + b[1] * b[1];
};
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
if (K >= points.size()) {
return points;
}
vector<vector<int>>res;
make_heap(res.begin(),res.end(),cmp); //大顶堆
for (auto& point : points) {
if (res.size() >= K) {
if(cmp(point,res[0])){ //当前point小于堆顶,pop堆顶,push当前point
pop_heap(res.begin(), res.end(),cmp);
res.pop_back();
res.push_back(point);
push_heap(res.begin(), res.end(), cmp);
}
}
else{
res.push_back(point);
push_heap(res.begin(), res.end(), cmp);
}
}
return res;
}
};

我看题解好像还有个神仙O(N)解法,没看,估计看了面试也背不出来,就这样。。2019年11月5日 15:23:24

973. 最接近原点的 K 个点的更多相关文章

  1. LeetCode——973. 最接近原点的 K 个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  2. 【力扣】973. 最接近原点的 K 个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  3. leetcode-973最接近原点的K个点

    leetcode-973最接近原点的K个点 题意 我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) ...

  4. [Swift]LeetCode973. 最接近原点的 K 个点 | K Closest Points to Origin

    We have a list of points on the plane.  Find the K closest points to the origin (0, 0). (Here, the d ...

  5. 最接近原点的K个点

    一.题目描述 我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点 这里,平面上两点之间的距离是欧几里德距离 你可以按任何顺序返回答案.除了点坐标的顺序 ...

  6. Leetcode973. K Closest Points to Origin最接近原点的K个点

    我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...

  7. leetcode-973-最接近原点的K个点

    题目描述: 可参考:题215 方法一:排序 class Solution: def kClosest(self, points: List[List[int]], K: int) -> List ...

  8. LeetCode刷题总结-双指针、位运算和分治法篇

    本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...

  9. LeetCode:堆专题

    堆专题 参考了力扣加加对与堆专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就忘光光了 力扣加加-堆专题(上) 力扣加加-堆专题(下) 总结 优先队列 // 1.java中有优先队 ...

随机推荐

  1. ACM-ICPC 2018 徐州赛区网络预赛 Ryuji doesn't want to study

    简单数学变换+线段树 简单数据结构签到题不解释 本来应该贴板子的,鉴于最近写代码太少了,而且由于要用两个线段树,平时板子都是一个的.以及板子在队友那.就当熟悉写代码,自己写了一下. #include ...

  2. Ajax基础原理与应用

    Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var handleResponse = func ...

  3. CSS 实现一个自适应的正方形

      传统方法正方形用固定的形式写 直接长=宽写固定的值如下   .box{   width: 200px;   height: 200px;   background: pink;   color: ...

  4. jQuery---三组基本动画 show hide

    三组基本动画 show hide //show不传参数,没有动画效果 $("div").show(); //show(speed) //speed:动画的持续时间 可以是毫秒值 还 ...

  5. CSS:display:none的使用注意事项

    ​总结:display:none  属性会使元素完全隐藏,js无法获得元素,通过js设置style.display="inline-block" 后 js才可获得此元素的属性和内容 ...

  6. 倍加福r2000激光驱动安装及使用

    第一次完成激光的驱动安装和激光数据的采集,遇到很多问题,最后一一解决,现在记录下来,方便后面給机器人安装激光使用 激光的了解 (1)激光型号:OMD30M-R2000(30M表示30m) (2)参考手 ...

  7. 杭电oj2037——今年暑假不AC(java实现)

    思路:标准贪心 先把所有思路列出来: 1.优先选择开始时间最早的,经分析,不可行 2.优先选择持续时间最短的,经分析,不可行 3.优先选择结束时间最早的,经分析,可行 然后根据第三种思路实现代码就好 ...

  8. jmeter请求报错

    jmeter发送json数据,报405.400错误解决方案: https://www.cnblogs.com/sunny-sl/p/8044284.html 405:Content-Type不对 40 ...

  9. laravel的Validation检索验证错误消息

    基本用法 处理错误消息 错误消息和视图 可用的验证规则 有条件地添加规则 自定义错误消息 自定义验证规则 基本用法 Laravel提供了一个简单.方便的工具,用于验证数据并通过validation类检 ...

  10. IntelliJ IDEA 2019.1.3 最新破解教程【最强 可用至2099年】

    本文包括最新[2019.1.2]安装 和[2018.3.2](推荐)安装 ①IntelliJ IDEA 2018.3.2安装永久安装[最强]  一. 在官网下载IDEA安装包  链接:https:// ...