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.mzph.cn/diannao/39530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学嵌入式是弄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…

模电-二极管及其应用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 风格品质卓越

单向链表结构

链表结构简介 链表结构是一种用比较特殊的数据结构类型&#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;基于业…

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数据的代…

昇思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…

Vue项目打包上线

Nginx 是一个高性能的开源HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它在设计上旨在处理高并发的请求&#xff0c;是一个轻量级、高效能的Web服务器和反向代理服务器&#xff0c;广泛用于提供静态资源、负载均衡、反向代理等功能。 1、下载nginx 2、…

k8s学习--k8s群集ELK日志收集部署最详细的过程与应用(收集k8s群集日志)(图形化界面手把手教学)

文章目录 FilebeatFilebeat主要特点Filebeat使用场景 ELK简介Elasticsearch简介Elasticsearch主要特点Elasticsearch使用场景 Logstash简介Logstash主要特点Logstash使用场景 Kibana简介Kibana主要特点Kibana使用场景 简单理解 环境一、ELK集群部署1.软件安装2.软件配置及启动(…

Webpack: Loader开发 (2)

概述 在上一篇文章中&#xff0c;我们已经详细了解了开发 Webpack Loader 需要用到的基本技能&#xff0c;包括&#xff1a;Loader 基本形态、如何构建测试环境、如何使用 Loader Context 接口等。接下来我们继续拓展学习一些 Loader 辅助工具&#xff0c;包括&#xff1a; 了…

什么是自然语言处理(NLP)?详细解读文本分类、情感分析和机器翻译的核心技术

什么是自然语言处理&#xff1f; 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能的一个重要分支&#xff0c;旨在让计算机理解、解释和生成人类的自然语言。打个比方&#xff0c;你和Siri对话&#xff0c;或使用谷歌翻译翻译一…

2024广州国际米粉产业展览会暨米粉节

2024广州国际米粉产业展览会 时间&#xff1a;2024年11月16-18日 地点&#xff1a;广州中国进出口商品交易会展馆 主办单位&#xff1a;企阳国际会展集团 【展会简介】 米粉作为一种历史悠久&#xff0c;人们日常食用的食物&#xff0c;其市场需求稳定&#xff0c;且随着人…

WSL2安装ContOS7并更新gcc

目录 WSL2安装CentOS7下载安装包安装启动CentOS7 CentOS7更换国内源gcc从源码安装gcc卸载gcc CMake中使用gcc关于linux配置文件参考 WSL2安装CentOS7 Windows11官方WSL2已经支持Ubuntu、Open SUSE、Debian。但是没有centos&#xff0c;所以centos的安装方式略有不同。 下载安…

家政小程序的开发:打造现代式便捷家庭服务

随着现代生活节奏的加快&#xff0c;人们越来越注重生活品质与便利性。在这样的背景下&#xff0c;家政服务市场迅速崛起&#xff0c;成为许多家庭日常生活中不可或缺的一部分。然而&#xff0c;传统的家政服务往往存在信息不对称、服务效率低下等问题。为了解决这些问题&#…