日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 973. 最接近原点的 K 个点(排序/优先队列/快排)

發(fā)布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 973. 最接近原点的 K 个点(排序/优先队列/快排) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 排序
      • 2.2 優(yōu)先隊列
      • 2.3 快排思路

1. 題目

我們有一個由平面上的點組成的列表 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]] 也會被接受。)提示: 1 <= K <= points.length <= 10000 -10000 < points[i][0] < 10000 -10000 < points[i][1] < 10000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/k-closest-points-to-origin
著作權歸領扣網(wǎng)絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。

2. 解題

類似題目:LeetCode 215. 數(shù)組中的第K個最大元素(快速排序)

2.1 排序

class Solution { public:vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {if(K == points.size())return points;sort(points.begin(),points.end(),[&](auto a, auto b){return a[0]*a[0]+a[1]*a[1] < b[0]*b[0]+b[1]*b[1];});points.resize(K);return points;} };

1772 ms 191.6 MB

partial_sort 只對前部分[first,middle)進行排序,前部分實現(xiàn)為堆

class Solution { public:vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {partial_sort(points.begin(), points.begin() + K, points.end(), [&] (auto a, auto b){return a[0]*a[0]+a[1]*a[1] < b[0]*b[0]+b[1]*b[1]; });points.resize(K);return points;} };

1552 ms 148.4 MB
時間復雜度 O(nlogn)O(nlogn)O(nlogn)

2.2 優(yōu)先隊列

  • 維持一個容量為K的大頂堆
  • 隊列滿了,后續(xù)點比堆頂更接近原點時,pop堆頂,push當前點
struct cmp{bool operator()(const vector<int>& a, const vector<int>& b)const{return a[0]*a[0]+a[1]*a[1] < b[0]*b[0]+b[1]*b[1];//大頂堆} }; class Solution { public:vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {if(K == points.size())return points;priority_queue<vector<int>, vector<vector<int>>, cmp> q;for(int i = 0; i < points.size(); ++i){if(q.size() < K)q.push(points[i]);else if(q.top()[0]*q.top()[0]+q.top()[1]*q.top()[1] > points[i][0]*points[i][0]+points[i][1]*points[i][1]){q.pop();q.push(points[i]);}}vector<vector<int>> ans(q.size());int i = 0;while(!q.empty()){ans[i++] = q.top();q.pop();}return ans;} };

時間復雜度 O(nlogK)O(nlogK)O(nlogK)
628 ms 47.5 MB

2.3 快排思路

class Solution { public:vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {if(K == points.size())return points;findkth(points,0,points.size()-1,K);points.resize(K);return points;}int dis(vector<vector<int>>& points, int i){return points[i][0]*points[i][0]+points[i][1]*points[i][1];}void findkth(vector<vector<int>>& points,int l, int r, int K){int i = l, j = r, p = dis(points, l);while(i < j){while(i < j && dis(points,j) > p)//必須先從右邊開始,因為選的pivot在左邊j--;while(i < j && dis(points,i) <= p)i++;swap(points[i], points[j]);}swap(points[l], points[i]);if(i < K)//左邊都是答案的一部分,取右邊找findkth(points,i+1,r,K);else if(i > K)//左邊多于K個,在左邊繼續(xù)分割findkth(points,l,i-1,K);elsereturn;} };

時間復雜度 O(n)O(n)O(n)
244 ms 39 MB

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結

以上是生活随笔為你收集整理的LeetCode 973. 最接近原点的 K 个点(排序/优先队列/快排)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。