给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。

序号代表了一个元素有多大。序号编号的规则如下:

  • 序号从 1 开始编号。
  • 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
  • 每个数字的序号都应该尽可能地小。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= arr.length <= 105
  • -10^ 9 <= arr[i] <= 10^9

Code:

常规超时思路

  1. class Solution {
  2. public:
  3. vector<int> arrayRankTransform(vector<int>& arr) {
  4. if(arr.size()==0)
  5. return arr;
  6. vector<int>arrsrc=arr;
  7. sort(arr.begin(),arr.end());
  8. typedef struct
  9. {
  10. int num;
  11. int index;
  12. }param;
  13. vector<param>vec;
  14. vector<int>res;
  15. int cnt=1;
  16. param p;
  17. p.num=arr[0];
  18. p.index=cnt;
  19. vec.push_back(p);
  20. map<int,param>mymap;
  21. for(int i=1;i<arr.size();i++)
  22. {
  23. param p;
  24. p.num=arr[i];
  25. if(arr[i]==arr[i-1])
  26. {
  27. p.index=cnt;
  28. }
  29. else
  30. p.index=++cnt;
  31. vec.push_back(p);
  32. }
  33. for(int i=0;i<arrsrc.size();i++)
  34. {
  35. for(int j=0;j<vec.size();j++)
  36. {
  37. if(vec[j].num==arrsrc[i])
  38. {
  39. res.push_back(vec[j].index);
  40. break;
  41. }
  42. }
  43. // res.push_back();
  44. }
  45. return res;
  46. }
  47. };

终极大法:利用map解决时间问题

Code:

  1. class Solution {
  2. public:
  3. vector<int> arrayRankTransform(vector<int>& arr) {
  4. vector<int>arrsrc=arr;
  5. sort(arr.begin(),arr.end());
  6. typedef struct
  7. {
  8. int num;
  9. int index;
  10. }param;
  11. vector<param>vec;
  12. vector<int>res;
  13. if(arr.size()==0)
  14. return res;
  15. int cnt=1;
  16. param p;
  17. p.num=arr[0];
  18. p.index=cnt;
  19. vec.push_back(p);
  20. map<int,param>mymap;
  21. mymap[arr[0]]=p;
  22. for(int i=1;i<arr.size();i++)
  23. {
  24. param p;
  25. p.num=arr[i];
  26. if(arr[i]==arr[i-1])
  27. {
  28. p.index=cnt;
  29. }
  30. else
  31. p.index=++cnt;
  32. vec.push_back(p);
  33. mymap[arr[i]]=p;
  34. }
  35. for(int i=0;i<arrsrc.size();i++)
  36. {
  37. res.push_back(mymap[arrsrc[i]].index);
  38. }
  39. return res;
  40. }
  41. };

Leetcode 1331. 数组序号转换的更多相关文章

  1. LeetCode 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树

    第108题 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10 ...

  2. php数组编码转换函数的示例

    场景说明/问题描述: Ajax提交页面编码为gb2312,数据库编码为utf8,在不更改页面及数据库编码的情况下插入数据. 自定义函数:  代码如下 复制代码 function array_iconv ...

  3. qt 字符数组如何转换字符串?

    char 字符数组如何转换成 QString? char source{1024} = {0}; QString des = QString::fromLocal8Bit(source);

  4. Javascript数组系列四之数组的转换与排序Sort方法

    今天我们继续来介绍 Javascirpt 数组中的方法,也是数组系列的第四篇文章,因为数组的方法众多,每篇文章我们都对数组的每个方法都有比较细致的描述,只要你能够从中成长一点点,那我们的目的就达到了, ...

  5. 集合 数组 定义 转换 遍历 Arrays API MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. LeetCode:数组中的第K个最大元素【215】

    LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ...

  7. C#结构体和字节数组的转换函数

    在通信过程中,一般我们都会操作到字节数组.特别是希望在不同语言编程进行操作的时候. 虽然C#提供了序列化的支持,不用字节数组也行.但操作字节数组肯定会碰到.   一般都会采用结构来表示字节数组.但结构 ...

  8. 图片和base64编码字符串 互相转换,图片和byte数组互相转换

    图片和base64编码字符串 互相转换 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; ...

  9. 数组/矩阵转换成Image类

    Python下将数组/矩阵转换成Image类 原创 2017年04月21日 19:21:27 标签: python / 图像处理 3596 先说明一下为什么要将数组转换成Image类.我处理的图像是F ...

随机推荐

  1. [RPC学习]Dubbo+nacos实现动态更新内存RTree

    1.背景 服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HT ...

  2. 浅谈stm32的外部中断

    简述 本文简单介绍stm32外部中断的一般操作步骤,后续会补充外部中断的相关内容 stm32的中断控制器支持19个外部中断/事件请求: line0~line15:这16条line分别对应不同GPIO口 ...

  3. MAC 地址为什么不需要全球唯一

    MAC 地址(Media access control address)是分配给网络接口控制器(Network interface controller, NIC)的唯一标识符,它会在网络段中充当网络 ...

  4. selenium模块 phantomJs 谷歌无可视界面

    参考微博: 什么是selenium 一款基于浏览器自动化的模块 什么是浏览器自动化 通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中 ...

  5. unity---Lighting面板

    打开Lighting面板 将天空盒改为别墅 图片转化为Cube 设置一个材质球

  6. 109_Power Pivot客户ABC(帕累托)分析度量值写法(非计算列)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 客户ABC分析,一般的套路是在计算列中把客户ABC分类,便于后续维度使用.今天用度量值的方式写一个ABC的分类. ...

  7. c++:-9

    上节(c++:-8)主要学习了C++的流类库和输入输出,本节学习C++的异常处理. 异常处理 介绍 (1)异常处理的基本思想: (2)异常处理的语法: (3)举例:处理除0异常 #include &l ...

  8. python面向对象双下划线方法与元类

    目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...

  9. sqlserver2008 数据库中查询存储过程的的创建修改和执行时间,以及比较常见的系统视图和存储过程

    因为各种原因数据库中存在大量无用的存储过程,想查询存储过程的最后执行情况,处理长期不使用的存储过程 下面这条语句可以查询存储过程创建 修改和执行的最后时间: SELECT a.name AS 存储过程 ...

  10. ML第一周学习小结

    最近的学习内容为<Python机器学习基础教程>这本书 从第一章开始,慢慢来,比较快. 一下为我的本周机器学习小结,以及下周的Flag. 本周收获 总结一下本周学习内容: 1.了解到机器学 ...