【LeetCode每日一题】——1331.数组序号转换

news2024/9/29 13:20:49

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【题目提示】
  • 七【解题思路】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 排序

二【题目难度】

  • 简单

三【题目编号】

  • 1331.数组序号转换

四【题目描述】

  • 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
  • 序号代表了一个元素有多大。序号编号的规则如下:
    • 序号从 1 开始编号。
    • 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
    • 每个数字的序号都应该尽可能地小。

五【题目示例】

  • 示例 1:

    • 输入:arr = [40,10,20,30]
    • 输出:[4,1,2,3]
    • 解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。
  • 示例 2:

    • 输入:arr = [100,100,100]
    • 输出:[1,1,1]
    • 解释:所有元素有相同的序号。
  • 示例 3:

    • 输入:arr = [37,12,28,9,100,56,80,5,12]
    • 输出:[5,3,4,2,8,6,7,1,3]

六【题目提示】

  • 0 < = a r r . l e n g t h < = 1 0 5 0 <= arr.length <= 10^5 0<=arr.length<=105
  • − 1 0 9 < = a r r [ i ] < = 1 0 9 -10^9 <= arr[i] <= 10^9 109<=arr[i]<=109

七【解题思路】

  • 利用排序+哈希
  • 首先复制一份原数组,然后对原数组从小到大排序
  • 然后对排序后的数组进行哈希,key为数组值,val为数组值对应的排序,这样就可以对数组值去重,且记录每个数组值对应的数组下标
  • 最后遍历复制的数组,对于每个元素我们取出其排序后的位置,设置为当前值
  • 最后返回复制的数组即可

八【时间频度】

  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn) n n n为传入的数组的长度
  • 空间复杂度: O ( n ) O(n) O(n) n n n为传入的数组的长度

九【代码实现】

  1. Java语言版
class Solution {
    public int[] arrayRankTransform(int[] arr) {
        int n = arr.length;
        int[] temp = new int[n];
        for(int i = 0;i < n;i++){
            temp[i] = arr[i];
        }
        Arrays.sort(arr);
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0;i < n;i++){
            if(!map.containsKey(arr[i])){
                map.put(arr[i], map.size() + 1);
            }
        }
        for(int i = 0;i < n;i++){
            temp[i] = map.get(temp[i]);
        }
        return temp;
    }
}
  1. C语言版
typedef struct
{
    int key;
    int val;
    UT_hash_handle hh;
}HashItem;

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

int* arrayRankTransform(int* arr, int arrSize, int* returnSize)
{
    int* sortArr = (int*)malloc(sizeof(int) * arrSize);
    int* res = (int*)malloc(sizeof(int) * arrSize);
    memcpy(sortArr, arr, sizeof(int) * arrSize);
    qsort(sortArr, arrSize, sizeof(int), cmp);
    HashItem *map = NULL;
    for(int i = 0;i < arrSize;i++)
    {
        HashItem *temp = NULL;
        HASH_FIND_INT(map, &sortArr[i], temp);
        if(temp == NULL)
        {
            temp = (HashItem *)malloc(sizeof(HashItem));
            temp->key = sortArr[i];
            temp->val = HASH_COUNT(map) + 1;
            HASH_ADD_INT(map, key, temp);
        }
    }
    for(int i = 0;i < arrSize;i++)
    {
        HashItem *temp = NULL;
        HASH_FIND_INT(map, &arr[i], temp);
        res[i] = temp->val;
    }
    *returnSize = arrSize;
    HashItem *cur, *temp;
    HASH_ITER(hh, map, cur, temp)
    {
        HASH_DEL(map, cur);
        free(cur);
    }
    free(sortArr);
    return res;
}
  1. Python语言版
class Solution:
    def arrayRankTransform(self, arr: List[int]) -> List[int]:
        n = len(arr)
        temp = [0] * n
        for i in range(0, n):
            temp[i] = arr[i]
        arr.sort()
        map = {}
        for i in range(0, n):
            if arr[i] not in map:
                map[arr[i]] = len(map) + 1
        for i in range(0, n):
            temp[i] = map[temp[i]]
        return temp
  1. C++语言版
class Solution {
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
        int n = arr.size();
        vector<int> temp = arr;
        sort(arr.begin(), arr.end());
        unordered_map<int, int> map;
        for(int i = 0;i < n;i++){
            if(!map.count(arr[i])){
                map[arr[i]] = map.size() + 1;
            }
        }
        for(int i = 0;i < n;i++){
            temp[i] = map[temp[i]];
        }
        return temp;
    }
};

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  3. Python语言版
    在这里插入图片描述

  4. C++语言版
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/887507.html

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

相关文章

将SM2根证书预置到chromium中

最近花了很多精力在做chromium的GmSSL适配&#xff0c;协议和算法都已经完成&#xff0c;这篇文章是关于将SM2根证书预置到chromium中 我的开发测试环境是macos12.4&#xff0c;从chromium的代码和文档中得知证书获取和校验都是通过操作系统以及native api接口完成&#xff0c…

leetcode 917.仅仅反转字母

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;仅仅反转字母 ps&#xff1a; 这道题思路很简单&#xff0c;只需要一个下标在前一个下标在后&#xff0c;分别找是字母的字符&#xff0c;找到之后交换即可。 代码&#xff1a; class Solution { public:bool isAlpha …

QT:鼠标事件

鼠标事件&#xff08;QEvent&#xff09; 把帮助文档里面搜索QEvent则可查看相关内容&#xff0c;举例 鼠标进入的事件EnterEvent&#xff0c;是一个虚函数&#xff0c;对应的还要进入的函数leaveEvent 新建一个类&#xff0c;作为新的控件&#xff0c;打印鼠标事件 #inclu…

Unity UI内存泄漏优化

项目一运行&#xff0c;占用的内存越来越多&#xff0c;不会释放&#xff0c;导致GC越来越频繁&#xff0c;越来越慢&#xff0c;这些都是为什么呢&#xff0c;今天从UI方面谈起。 首先让我们来聊聊什么是内存泄漏呢&#xff1f; 一般来讲内存泄漏就是指我们的应用向内存申请…

W6100-EVB-PICO 做UDP Client 进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…

JAVA基础知识(二)——程序流程控制

程序流程控制 一、程序流程控制1.1 程序流程控制1.2 顺序结构1.3 分支结构1.4 循环结构1.5 嵌套循环1.6 return的使用 一、程序流程控制 1.1 程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句&#xff0c;可以把语句组合成能完成一定功能的小逻辑模块。 其流程…

Vue2-TodoList案例

TodoList案例 组件化编码流程&#xff08;通用&#xff09;整体思路1、分析结构2、拆html和css3、初始化列表4、实现添加列表功能5、实现勾选功能6、实现删除功能7、实现底部统计功能8、实现全选框的交互&#xff08;1&#xff09;每个todo控制全选框&#xff08;2&#xff09;…

第7章 C控制语句:分支和跳转

本章介绍以下内容&#xff1a; 关键字&#xff1a;if、else、switch、continue、break、case、default、goto 运算符&#xff1a;&&、||、?: 函数&#xff1a;getchar()、putchar()、ctype.h系列 如何使用if和if else语句&#xff0c;如何嵌套它们 在更复杂的测试表达…

SpringBoot的配置文件(properties与yml)

文章目录 1. 配置文件的作用2. 配置文件格式3. 配置文件的使用方法3.1. properties配置文件3.1.1. 基本语法和使用3.1.2. properties优缺点分析 3.2. yml配置文件3.2.1. 基本语法与使用3.2.2. yml中单双引号问题3.2.3. yml配置不同类型的数据类型及null3.2.4. 配置对象3.2.5. 配…

百日筑基篇——Linux中文本工具应用(Linux入门六)

百日筑基篇——Linux中文本工具应用&#xff08;Linux入门六&#xff09; 文章目录 前言一、文本搜索工具 **grep**二、流式文本处理工具 **sed**三、文本处理工具 **awk**总结 前言 在Linux中&#xff0c;通常会使用一些工具来处理文本以获得所需的内容。而Linux中的文本处理…

python编程小游戏 五子棋,python编程小游戏简单的

大家好&#xff0c;本文将围绕python编程小游戏如何停止展开说明&#xff0c;python编程小游戏日语教程是一个很多人都想弄明白的事情&#xff0c;想搞清楚python编程小游戏超级玛丽需要先了解以下几个事情。 今天分享一个有趣的Python游戏库freegames&#xff0c;它里面包含经…

前端新手学习路线

文章目录 前端学习路线&#xff01;特点符号表大纲前言 - 学编程需要的特质一、前端入门⭐️ 开发工具浏览器编辑器文档笔记 ⭐️ HTML⭐️ CSS⭐️ JavaScript✅ ES6 特性 二、巩固基础前端基础知识计算机基础✅ 算法和数据结构✅ 计算机网络✅ 操作系统 软件开发基础✅ 设计模…

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?

上文我们已经学到&#xff0c; 一个Topic&#xff08;主题&#xff09;会有多个Partition&#xff08;分区&#xff09;为了保证高可用&#xff0c;每个分区有多个Replication&#xff08;副本&#xff09;副本分为Leader 和 Follower 两个角色&#xff0c;Follower 从Leader同…

【数据结构】实现顺序表

目录 一.介绍顺序表二.实现顺序表1.创建多文件2.顺序表的存储方式3.函数的声明4.初始化顺序表5.清理顺序表6.打印顺序表7.扩容8.尾插8.尾删9.头插10.头删11.查找12.修改13.在pos位置插入13.在pos位置删除 三.全部代码1.SeqList.h2.SeqList.c3.Test.c 一.介绍顺序表 顺序表是用…

【佳佳怪文献分享】使用点云从半监督到全监督房间布局估计

标题&#xff1a;From Semi-supervised to Omni-supervised Room Layout Estimation Using Point Cloud 作者&#xff1a;Huan-ang Gao, Beiwen Tian, Pengfei Li, Xiaoxue Chen, Hao Zhao, Guyue Zhou , Yurong Chen and Hongbin Zha 来源&#xff1a;2023 IEEE Internation…

Android系统-线程-消息处理机制

引言&#xff1a; Android应用消息处理机制是怎么样的呢&#xff1f; 跟Native&#xff0c;Linux底层都有些什么关系呢&#xff1f; 概念与理解&#xff1a; Android应用程序是通过消息来驱动的。 1&#xff09;应用程序的每一个线程在启动的时候&#xff0c;都可以首先在内…

Swagger-ui在idea中的使用

1.添加依赖 <!--添加swagger2相关概念--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><!--添加swagger-ui相关功能--><de…

【贪心+堆】CF1701 D

Problem - 1701D - Codeforces 题意&#xff1a; 思路&#xff1a; 手推样例可知&#xff1a; 一开始想的是&#xff0c;把这些区间按右端点排序&#xff0c;然根据排序后的贪心 事实上不是这样的&#xff0c;而是要把有可能的区间扔进堆里&#xff1a; 感觉这种带堆的贪心&…

【TI-CCS笔记】工程编译配置 bin文件的编译和生成 各种架构的Post-build配置汇总

【TI-CCS笔记】工程编译配置 bin文件的编译和生成 各种架构的Post-build配置汇总 TI编译器分类 在CCS按照目录下 有个名为${CG_TOOL_ROOT}的目录 其下就是当前工程的编译器 存放目录为&#xff1a; C:\ti\ccs1240\ccs\tools\compiler按类型分为五种&#xff1a; ti-cgt-arm…

J‘meter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar&#xff0c;放在 jmeter 的 bin 目录下 5.2 在测试计划中&#xff0c;将 jar 包添加到脚本中 5.3 输入参…