973. 最接近原點的 K 個點-k數組維護+二分查找

973. 最接近原點的 K 個點-k數組維護+二分查找

給定一個數組 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一個點,并且是一個整數 k ,返回離原點 (0,0) 最近的 k 個點。

這里,平面上兩點之間的距離是 歐幾里德距離( √(x1 - x2)2 + (y1 - y2)2 )。

你可以按 任何順序 返回答案。除了點坐標的順序之外,答案 確保 是 唯一 的。

示例 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]] 也會被接受。)

對于這題我們維護了一個數組長度為K得數組

/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both indexned array and *columnSizes array must be malloced, assume caller calls free().*/int find_index(int *a,int size,int v){int high=size-1;int low=0;if(a[size-1]<=v){return -1;}else{while(low<=high){int mid=(high+low)/2;if(a[mid]>v){high=mid-1;}else{low=mid+1;}}return low;}}
int** kClosest(int** points, int pointsSize, int* pointsColSize, int k, int* returnSize, int** returnColumnSizes) {int **a=(int **)malloc(sizeof(int*)*k);int  min_index[k];int index_record[k];*returnColumnSizes = malloc(sizeof(int) * k);for(int i=0;i<k;i++){a[i]=(int *)malloc(sizeof(int)*2);}for(int i=0;i<k;i++){(*returnColumnSizes)[i] = 2;}for(int i=0;i<k;i++){int z=points[i][0]*points[i][0]+points[i][1]*points[i][1];min_index[i]=points[i][0]*points[i][0]+points[i][1]*points[i][1];//   printf("z %d ",z);index_record[i]=i;if(i==0){continue;}else{int j=i-1;for(;j>=0;j--){if(min_index[j]>z){min_index[j+1]=min_index[j];index_record[j+1]=index_record[j];}else{break;}}// printf("-- %d ",j);if(j!=0){min_index[j+1]=z;index_record[j+1]=i;}if(j==0){if(min_index[j]>z){min_index[0]=z;index_record[0]=i;}else{min_index[j+1]=z;index_record[j+1]=i;}}//  printf("j %d",j);}//       for(int iz=0;iz<i;iz++){//     printf("*%d ",min_index[iz]);//  }//  printf("\n");}for(int i=k;i<pointsSize;i++){int v=points[i][0]*points[i][0]+points[i][1]*points[i][1];int find_index_min=find_index(min_index,k,v);// printf(" find_index_min %d ",find_index_min);if(find_index_min==-1){continue;}else{for(int j=k-1;j>find_index_min;j--){min_index[j]=min_index[j-1];index_record[j]=index_record[j-1];}min_index[find_index_min]=points[i][0]*points[i][0]+points[i][1]*points[i][1];index_record[find_index_min]=i;}}for(int i=0;i<k;i++){a[i][0]=points[index_record[i]][0];a[i][1]=points[index_record[i]][1];}*returnSize=k;return a;
}

其運行情況如下:
在這里插入圖片描述

當然上面這個方法是很粗糙的,而且有多余的內存消耗,博主發現,內存還可以優化,下面是優化后的代碼:

/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both indexned array and *columnSizes array must be malloced, assume caller calls free().*/int find_index(int *a,int size,int v){int high=size-1;int low=0;if(a[size-1]<=v){return -1;}else{while(low<=high){int mid=(high+low)/2;if(a[mid]>v){high=mid-1;}else{low=mid+1;}}return low;}}
int** kClosest(int** points, int pointsSize, int* pointsColSize, int k, int* returnSize, int** returnColumnSizes) {int  min_index[k];*returnColumnSizes = malloc(sizeof(int) * k);for(int i=0;i<k;i++){(*returnColumnSizes)[i] = 2;}for(int i=0;i<k;i++){int z=points[i][0]*points[i][0]+points[i][1]*points[i][1];min_index[i]=points[i][0]*points[i][0]+points[i][1]*points[i][1];//   printf("z %d ",z);int x=points[i][0];int y=points[i][1];if(i==0){continue;}else{int j=i-1;for(;j>=0;j--){if(min_index[j]>z){min_index[j+1]=min_index[j];points[j+1][0]=points[j][0];points[j+1][1]=points[j][1];}else{break;}}// printf("-- %d ",j);if(j!=0){points[j+1][0]=x;points[j+1][1]=y;min_index[j+1]=z;}if(j==0){if(min_index[j]>z){min_index[0]=z;points[0][0]=x;points[0][1]=y;}else{min_index[j+1]=z;points[j+1][0]=x;points[j+1][1]=y;}}//  printf("j %d",j);}//       for(int iz=0;iz<i;iz++){//     printf("*%d ",min_index[iz]);//  }//  printf("\n");}for(int i=k;i<pointsSize;i++){int v=points[i][0]*points[i][0]+points[i][1]*points[i][1];int find_index_min=find_index(min_index,k,v);// printf(" find_index_min %d ",find_index_min);if(find_index_min==-1){continue;}else{for(int j=k-1;j>find_index_min;j--){min_index[j]=min_index[j-1];points[j][0]=points[j-1][0];points[j][1]=points[j-1][1];}min_index[find_index_min]=points[i][0]*points[i][0]+points[i][1]*points[i][1];points[find_index_min][0]=points[i][0];points[find_index_min][1]=points[i][1];}}*returnSize=k;return points;
}

這個運行情況要多好了:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39530.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39530.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39530.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洗衣機水龍頭要買有止逆閥的,多花幾十元能省掉幾萬,值了

問大家一下&#xff0c;你家洗衣機水龍頭用的是什么樣的&#xff1f;      可能有業主會說我家買的是純銅的&#xff0c;質量挺好的。      如果你家選的洗衣機水龍頭僅僅是純銅的&#xff0c;并沒有其他的功能&#xff0c;你還是選做錯了。      因為洗衣機水龍頭…

初學嵌入式是弄linux還是單片機?

在開始前剛好我有一些資料&#xff0c;是我根據網友給的問題精心整理了一份「單片機的資料從專業入門到高級教程」&#xff0c; 點個關注在評論區回復“666”之后私信回復“666”&#xff0c;全部無償共享給大家&#xff01;&#xff01;&#xff01;1、先入門了51先學了89c52…

leetcode每日一練:鏈表OJ題

鏈表經典算法OJ題 1.1 移除鏈表元素 題目要求&#xff1a; 給你一個鏈表的頭節點 head 和一個整數 val &#xff0c;請你刪除鏈表中所有滿足 Node.val val 的節點&#xff0c;并返回 新的頭節點 。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,6,3,4,5,6], val 6 輸出&a…

學習java第一百一十八天

Component 和 Bean 的區別是什么&#xff1f;Component 注解作用于類&#xff0c;而Bean注解作用于方法。Component通常是通過類路徑掃描來自動偵測以及自動裝配到 Spring 容器中&#xff08;我們可以使用 ComponentScan 注解定義要掃描的路徑從中找出標識了需要裝配的類自動裝…

Nacos 配置中心:動態加載 Bean

前提&#xff1a; 已經集成好 springboot / cloud 與nacos的環境 1 nacos中配置文件參數 message:#sender: emailMessageSendersender: smsMessageSender 2 接口和兩個實現類 public interface MessageSender {String sendMessage(String message, String recipient); }impo…

模電-二極管及其應用51單片機LED點亮前置工作!

今日小記 2024-7-2&#xff0c;星期二&#xff0c;16:32&#xff0c;天氣&#xff1a;晴&#xff0c;心情&#xff1a;晴。持續了兩個星期的梅雨天終于暫時過去啦&#xff0c;迎來了久違的陽光&#xff0c;雖然沒有雨天涼快&#xff0c;但是能看到太陽也是開心噠&#xff0c;心…

2021強網杯

一、環境 網上自己找 二、步驟 2.1拋出引題 在這個代碼中我們反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…

工業 web4.0UI 風格品質卓越

工業 web4.0UI 風格品質卓越

深入理解 RabbitMQ、RocketMQ等常?的消息中間件進?消息的異步數據處理

深入理解消息中間件對于構建高可用、高性能的分布式系統至關重要。以下是對RabbitMQ和RocketMQ這兩種常用消息中間件的異步數據處理的深入理解&#xff1a; ### RabbitMQ RabbitMQ是一個開源的消息代理&#xff0c;它支持多種消息協議&#xff0c;如AMQP、STOMP等&#xff0c;…

單向鏈表結構

鏈表結構簡介 鏈表結構是一種用比較特殊的數據結構類型&#xff0c;它也是線性數據結構中的一種&#xff0c;但是與棧結構等線性數據結構不同&#xff0c;它的內部結構并不是一個簡單的存儲空間&#xff0c;而是一個帶有指向性質的單元。要理解鏈表結構要弄清楚兩個問題&#x…

不要再被騙了!電腦無法進入系統的原因可能是這個硬件壞了而已……

前言 前段時間小白在抖音上發了很多很多很多的視頻&#xff0c;其中應該是有很多商家關注了小白。 然后就會出現很多很多很多的賺錢小門道…… 電腦開機沒有顯示&#xff1f;換顯卡&#xff01; 電腦還是不開機&#xff1f;換CPU 電腦還是一樣不開機…… 經過了一番大折騰…

10.8K star!史上最強Web應用防火墻雷池WAF

長亭雷池SafeLine是長亭科技耗時近 10 年傾情打造的WAF(Web Application Firewall)&#xff0c; 一款敢打出口號 “不讓黑客越雷池一步” 的 WAF&#xff0c;愿稱之為史上最強的一款Web應用防火墻&#xff0c;足夠簡單、足夠好用、足夠強的免費且開源的 WAF&#xff0c;基于業…

AI為小微企業賦能:解鎖數字化轉型的金鑰匙

AI為小微企業賦能&#xff1a;解鎖數字化轉型的金鑰匙 在當今全球經濟加速迭代的背景下&#xff0c;小微企業作為社會經濟肌體的毛細血管&#xff0c;面臨著前所未有的挑戰與機遇。人工智能&#xff08;AI&#xff09;的崛起&#xff0c;如同一股強大的科技旋風&#xff0c;為…

binlog區分業務修改還是手動修改

一、Windows下開啟MySQL binLog日志 首先要開啟MySQL的BinLog 管理 show variables like %log_bin%;如果發現log_bin是OFF&#xff0c;打開mysql文件夾下面的my.ini&#xff0c;修改一下 在 [mysqld] 下面加 # 開啟bin-log log-binmysql-bin # 開啟binlog功能 binl…

pads layout 腳本導出不能運行excle解決辦法

在一臺新的電腦上安裝好PADS&#xff0c;打開PCB文件導出坐標文件時&#xff1a; 出現“ActiveX Automation: server could not be found.”的問題,導致無法成功導出文件,錯誤提示截圖如下&#xff1a; 導致上述問題的原因是在我們配置導出帶坐標的腳本時,默認使用的是微軟…

Java 實現application/x-www-form-urlencoded編碼格式的POST請求

一、實現方式 在Java中&#xff0c;實現application/x-www-form-urlencoded內容類型通常涉及到發送HTTP POST請求。你可以使用java.net.HttpURLConnection或者第三方庫如Apache HttpClient來實現。 以下是使用HttpURLConnection發送application/x-www-form-urlencoded數據的代…

linux的shell腳本編程詳解

Shell 腳本是一種用于自動化任務的腳本語言&#xff0c;在 Linux 和其他類 Unix 操作系統中非常流行。它通常用于任務自動化、系統管理和批處理。編寫 Shell 腳本并使其自動化編譯過程&#xff08;例如使用 gcc 編譯 C/C 程序&#xff09;是一種常見的任務。 以下是一個詳細的…

昇思MindSpore學習筆記3--張量 Tensor

一、張量Tensor概念 矢量、標量和其他張量的計算函數&#xff0c;有內積、外積、線性映射以及笛卡兒積等 張量坐標在 n?維空間內&#xff0c;有?nr 個分量 每個分量都是坐標的函數,變換時每個坐標分量都按規則作線性變換 張量是一種特殊的數據結構&#xff0c;類似于數組和…

利用深度學習模型進行語音障礙自動評估

語音的產生涉及器官的復雜協調&#xff0c;因此&#xff0c;語音包含了有關身體各個方面的信息&#xff0c;從認知狀態和心理狀態到呼吸條件。近十年來&#xff0c;研究者致力于發現和利用語音生物標志物——即與特定疾病相關的語音特征&#xff0c;用于診斷。隨著人工智能&…

js基礎學習

1、js概述 js是javascript的簡稱&#xff0c;作用是實現頁面和用戶的交互 js由瀏覽器解析運行&#xff0c;不需要編譯 js由es基礎語法&#xff0c;bom瀏覽器相關&#xff0c;dom文檔操作相關 三大部分組成 2、html引入js <!DOCTYPE html> <html lang"zh-CN&qu…