973. 最接近原点的 K 个点-k数组维护+二分查找

news2024/7/4 8:59:53

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.coloradmin.cn/o/1886492.html

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

相关文章

【Rust入门教程】hello world程序

文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言&#xff0c;我们都会从编写一个简单的Hello World程序开始。这是一个传统&#xff0c;也是一个开始。在这篇文章中&#xff0c;我们将一起学习如何在Rust中编写你的第一个程序&#xff1a;Hello Worl…

干货分享|如何将前端代理服务器(BFF)接入身份认证(2)

续集2 前篇文章在前面发布&#xff0c;同学们可以自行找一下。 本篇文章将继续通过实例来详细讲解如何将前端代理服务器&#xff08;BFF&#xff09;接入身份认证。我们将使用一个示例应用来演示 BFF 与身份认证的集成过程。 1&#xff09;在 Keycloak 中新建一个安全领域 …

红队工具Finger 安装具体以步骤-示例centos

1.git clone https://github.com/EASY233/Finger.git 如果没有 yum install git 2.pip3 install -r requirements.txt 找到finger所在的文件夹 可以用find -name "Finger"进入文件中配置命令 前提要安装python yum install python-pip33.python3 Finger.py -h

中国AI产业迎来标准化大跃进,程序员们准备好了吗

中国AI产业迎来标准化大跃进&#xff0c;程序员们准备好了吗&#xff1f; 程序员们&#xff0c;你们是否已经感受到了人工智能技术的浪潮&#xff1f;现在&#xff0c;中国工信部联合其他部门发布了《国家人工智能产业综合标准化体系建设指南&#xff08;2024版&#xff09;》&…

龙迅LT8641UXE HDMI四进一出切换开关,支持标准HDMI 2.0内置MCU

龙迅LT8641UXE描述&#xff1a; Lontium LT8641UX HDMI2.0开关具有符合HDMI2.0/1.4规范的4&#xff1a;1开关&#xff0c;最大6Gbps高速数据速率&#xff0c;自适应均衡RX输入和预先强调的TX输出支持长电缆应用&#xff0c;没有XTAL板上节省BOM成本。LT8641UX HDMI2.0开关自动…

如何获取音频伴奏

如何获取音频伴奏 在今天的互联网上,有许多好听的音乐.面对这些音乐,我们有时需要伴奏音频,许多音频在网站上可以查找到,但有些不行,今天,我们要通过audacity软件截取音频伴奏. 下载audacity软件 audacity-64.exe 访问密码&#xff1a;8221 或官方网站(访问较慢) 选择简体…

LLM指令微调Prompt的最佳实践(二):Prompt迭代优化

文章目录 1. 前言2. Prompt定义3. 迭代优化——以产品说明书举例3.1 产品说明书3.2 初始Prompt3.3 优化1: 添加长度限制3.4 优化2: 细节纠错3.5 优化3: 添加表格 4. 总结5. 参考 1. 前言 前情提要&#xff1a; 《LLM指令微调Prompt的最佳实践&#xff08;一&#xff09;&#…

时序约束(二): input delay约束和output delay约束

一、input delay约束 在千兆以太网数据收发项目中&#xff0c;RGMII的数据输入方式为DDR&#xff0c;源同步输入方式&#xff0c;可以用之前提到的分析模型进行约束。 在时序约束原理中我们提到&#xff0c;input delay约束的就是发射沿lunch到数据有效的延时&#xff0c;根据…

本地项目推送到gitlab仓库的保姆级教程

目录 1、安装git &#xff08;1&#xff09;Windows系统 &#xff08;2&#xff09;Linux系统 2、gitlab创建空白项目 3、创建密钥 4、将密钥添加到gitlab中 5、远程配置 &#xff08;1&#xff09;配置全局的用户和邮箱 &#xff08;2&#xff09;本地文件夹初始化 …

Rust: polars行遍历,从dataframe到struct及Bar设计比较

pandas提供了iterrows()、itertuples()、apply等行遍历的方式&#xff0c;还是比较方便的。 polars的列操作功能非常强大&#xff0c;这个在其官网上有详细的介绍。由于polars底层的arrow是列存储模式&#xff0c;行操作效率低下&#xff0c;官方也不推荐以行方式进行数据操作。…

序号不足两位前面补0

预期目标 原始效果 代码实现 {${(index 1).toString().padStart(2, 0)}. ${item.sentence}}要实现自动编号并确保显示为两位数的格式&#xff0c;可以在 {index 1} 的地方进行格式化。在 JavaScript 中&#xff0c;可以使用 String.prototype.padStart() 方法来补足数字到指定…

Webpack: Loader开发 (1)

概述 如何扩展 Webpack&#xff1f;有两种主流方式&#xff0c;一是 Loader —— 主要负责将资源内容翻译成 Webpack 能够理解、处理的 JavaScript 代码&#xff1b;二是 Plugin —— 深度介入 Webpack 构建过程&#xff0c;重塑 构建逻辑。 相对而言&#xff0c;Loader 的职责…

三个方法教大家学会RAR文件转换为ZIP格式

在日常工作当中&#xff0c;RAR和ZIP是两种常见的压缩文件格式。有时候&#xff0c;大家可能会遇到将RAR文件转换为ZIP格式的情况&#xff0c;这通常是为了方便在特定情况下打开或使用文件。下面给大家分享几个RAR文件转换为ZIP格式的方法&#xff0c;下面随小编一起来看看吧~ …

如何通过指纹浏览器使用代理IP?

1.指纹浏览器定义 指纹浏览器是 一种浏览器技术&#xff0c;它根据用户设备的硬件、软件和配置等特征生成唯一标识符&#xff08;称为“指纹”&#xff09;。此指纹用于识别和追踪用户身份&#xff0c;即使用户更改其 IP 地址或清除浏览器数据&#xff08;如缓存和 Cookie&…

美国抗攻击服务器有哪些可靠的解决方案

美国抗攻击服务器在面对日益严重的网络安全威胁时&#xff0c;需要采取一系列可靠的解决方案来确保服务器的稳定运行和数据安全。以下是一些科普性质的抗攻击服务器解决方案&#xff1a; 一、流量清洗与过滤 流量清洗是美国抗攻击服务器应对DDoS攻击的重要措施。当检测到异常流…

助力构建新型电力系统自主可控实时底座

近日&#xff0c;2024亚洲新型电力系统及储能展览会&#xff06;亚洲新型电力及储能论坛会在广州广交会展馆圆满落下帷幕&#xff01;科东软件携多款电力产品亮相展会,并在2024亚洲新型电力及储能论坛发表《“鸿道Intewell操作系统助力构建新型电力系统自主可控实时底座”》的主…

机器学习-EM算法

目录 一:最大似然估计 二:EM算法 加入隐变量 EM算法推导 1.Jensen不等式 点个赞呗!!! 一:最大似然估计 举个栗子:一个袋子里有很多个球,每次放回的取一个球,取了十次,其中有六次白球,4次黑球。那么就认为袋子里面取到白球的概率为6/10,黑球的概率为4/10。…

C++——list类用法指南

一、list的介绍 1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2、list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素 …

51单片机外部中断(按键识别)

欢迎入群共同学习交流 时间记录&#xff1a;2024/7/2 一、电路原理图 51单片机包含INT0、INT1两个外部中断接口 二、知识点介绍 1.中断寄存器位介绍 &#xff08;1&#xff09;TCON定时控制寄存器&#xff0c;位0&#xff08;IT0&#xff09;中断INT0请求信号选择位&#x…

性能调优 性能监控

1.影响性能考虑点包括&#xff1a; 数据库、应用程序、中间件(tomcat、nginx)、网络和操作系统等方面。 首先考虑自己的应用属于 CPU密集型 还是 IO密集型 cpu密集型 计算&#xff0c;排序&#xff0c;分组查询&#xff0c;各种算法 IO密集型 网络传输&#xff0c;磁盘读…