0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

1365.有多少小于当前数字的数字

算法与数据结构 来源:代码随想录 作者:代码随想录 2022-06-30 09:39 次阅读

哈希表的神奇应用!

1365.有多少小于当前数字的数字

题目链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i]你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。

以数组形式返回答案。

示例 1:

  • 输入:nums = [8,1,2,2,3]
  • 输出:[4,0,1,1,3]
  • 解释:对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
    对于 nums[1]=1 不存在比它小的数字。
    对于 nums[2]=2 存在一个比它小的数字:(1)。
    对于 nums[3]=2 存在一个比它小的数字:(1)。
    对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

示例 2:

  • 输入:nums = [6,5,4,8]
  • 输出:[2,1,0,3]

示例 3:

  • 输入:nums = [7,7,7,7]
  • 输出:[0,0,0,0]

提示:

  • 2 <= nums.length <= 500
  • 0 <= nums[i] <= 100

思路

两层for循环暴力查找,时间复杂度明显为O(n^2)。

那么我们来看一下如何优化。

首先要找小于当前数字的数字,那么从小到大排序之后,该数字之前的数字就都是比它小的了。

所以可以定义一个新数组,将数组排个序。

排序之后,其实每一个数值的下标就代表这前面有几个比它小的了

代码如下:

vectorvec=nums;
sort(vec.begin(),vec.end());//从小到大排序之后,元素下标就是小于当前数字的数字

用一个哈希表hash(本题可以就用一个数组)来做数值和下标的映射。这样就可以通过数值快速知道下标(也就是前面有几个比它小的)。

此时有一个情况,就是数值相同怎么办?

例如,数组:1 2 3 4 4 4 ,第一个数值4的下标是3,第二个数值4的下标是4了。

这里就需要一个技巧了,在构造数组hash的时候,从后向前遍历,这样hash里存放的就是相同元素最左面的数值和下标了。代码如下:

inthash[101];
for(inti=vec.size()-1;i>=0;i--){//从后向前,记录vec[i]对应的下标
hash[vec[i]]=i;
}

最后在遍历原数组nums,用hash快速找到每一个数值 对应的 小于这个数值的个数。存放在将结果存放在另一个数组中。

代码如下:

//此时hash里保存的每一个元素数值对应的小于这个数值的个数
for(inti=0;i< nums.size(); i++) {
    vec[i] = hash[nums[i]];
}

流程如图:

de6ca87c-f812-11ec-ba43-dac502259ad0.png

关键地方讲完了,整体C++代码如下:

classSolution{
public:
vector<int>smallerNumbersThanCurrent(vector<int>&nums){
vector<int>vec=nums;
sort(vec.begin(),vec.end());//从小到大排序之后,元素下标就是小于当前数字的数字
inthash[101];
for(inti=vec.size()-1;i>=0;i--){//从后向前,记录vec[i]对应的下标
hash[vec[i]]=i;
}
//此时hash里保存的每一个元素数值对应的小于这个数值的个数
for(inti=0;i< nums.size(); i++) {
            vec[i] = hash[nums[i]];
        }
        returnvec;
}
};

可以排序之后加哈希,时间复杂度为O(nlogn)

其他语言版本

Java

publicint[]smallerNumbersThanCurrent(int[]nums){
Mapmap=newHashMap<>();//记录数字nums[i]有多少个比它小的数字
int[]res=Arrays.copyOf(nums,nums.length);
Arrays.sort(res);
for(inti=0;i< res.length; i++) {
            if(!map.containsKey(res[i])){//遇到了相同的数字,那么不需要更新该number的情况
map.put(res[i],i);
}
}
for(inti=0;i< nums.length; i++) {
            res[i] = map.get(nums[i]);
        }
        returnres;
}

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数值
    +关注

    关注

    0

    文章

    80

    浏览量

    14351
  • 数组
    +关注

    关注

    1

    文章

    414

    浏览量

    25902

原文标题:有多少小于当前数字的数字?

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数字输出接口哪些,数字输出接口的作用

    数字输出接口是电子设备中用于传输数字信号到外部设备的关键部分。这些接口种类繁多,各有特点,适用于不同的应用场景。以下是一些常见的数字输出接口:
    的头像 发表于 10-01 15:55 499次阅读

    高校转型数字化的原因哪些

    高校转型数字化的原因可以归结为多个方面,这些原因共同驱动着高等教育机构向数字化方向迈进。以下是几个主要的原因: 适应科技发展趋势: 随着信息技术的飞速发展,数字化已经成为各行各业不可逆转的趋势。高校
    的头像 发表于 09-26 10:39 207次阅读

    数字振荡器的特点哪些

    数字振荡器是一种电子设备,用于生成周期性的波形,如正弦波、方波、三角波等。它们在电子测试和测量、信号处理、通信和许多其他应用中非常重要。 1. 定义与基本原理 数字振荡器是一种利用数字技术生成周期性
    的头像 发表于 09-25 10:41 257次阅读

    数字振荡器的实现要求哪些

    数字振荡器(也称为数控振荡器,NCO)的实现要求涉及多个方面,主要包括高精度、灵活性、频率分辨率、相位连续性以及实现方法的优化等。以下是对这些要求的介绍: 1. 高精度 低正交误差 :在正交数字
    的头像 发表于 09-25 10:34 178次阅读

    什么是数字孪生?它有哪些优势?

    数字孪生作为产业数字化核心技术之一,正成为当下数字技术领域的焦点,其商业模式、应用场景、技术变革、产业趋势等正成为当前政产学研用各界关注的热点。
    的头像 发表于 09-19 09:40 369次阅读

    LV1365-EX条码识别模组在手持终端类中的应用

    在当今数字化转型的浪潮中,高效、精准的数据采集成为各行业提升运营效率的关键。LV1365-EX条码识别模组,凭借其卓越的性能和强大的条码识别能力,在手持终端设备中展现出了非凡的应用潜力,成为物流
    的头像 发表于 09-09 14:24 129次阅读
    LV<b class='flag-5'>1365</b>-EX条码识别模组在手持终端类中的应用

    数字示波器的测量方法哪三种

    数字示波器是一种广泛应用于电子测量领域的仪器,它能够实时显示电压波形,帮助工程师和技术人员对电子信号进行分析和测量。数字示波器的测量方法很多种,不同的测量方法适用于不同的应用场景。以下是三种常见
    的头像 发表于 07-17 18:02 1351次阅读

    数字电源控制芯片哪些型号

    数字电源控制芯片是一类用于实现电源管理的集成电路,广泛应用于各种电子设备中。它们具有高效率、低功耗、高可靠性等优点,可以有效地提高电源系统的稳定性和性能。 数字电源控制芯片的分类 数字电源控制芯片
    的头像 发表于 07-08 11:25 1082次阅读

    数字信号采集系统哪些功能

    数字信号采集系统(Digital Signal Acquisition System)是一种用于采集、处理和分析模拟信号的电子设备。它广泛应用于各种领域,如通信、医疗、工业自动化、科研等。本文将详细
    的头像 发表于 05-31 14:26 723次阅读

    数字信号采集的基本原理哪些

    引言 数字信号采集技术是将模拟信号转换为数字信号的过程,广泛应用于通信、音频处理、视频处理、医疗设备等领域。数字信号采集技术的核心是将连续的模拟信号转换为离散的数字信号,以便进行
    的头像 发表于 05-31 14:19 1004次阅读

    数字示波器的优缺点哪些

    数字示波器在电子测量领域具有显著的优势,同时也存在一些局限性。
    的头像 发表于 05-09 17:26 817次阅读

    数字化转型的“奇点”演进

    当前数字化转型已成为不可逆转的趋势,每一个工业企业都应该学习、思考和实践企业的数字化,这不仅仅是当前复杂市场格局的需要,也是未来企业长期发展、基业长青的基础。   而思考
    的头像 发表于 02-18 14:04 295次阅读

    车规级一体成型电感 VSAB1365-470M产品手册

    一体成型电感 VSAB1365-470M 感量47μH,饱和电流3.9A,尺寸13.45×12.6×6.30mm
    发表于 01-08 09:29 3次下载

    数字化转型是什么?哪些应用?

    数字化转型是指企业或组织通过采用数字技术来改变其业务模式和运营方式,以适应新兴市场趋势、提高效率、增强客户体验和增加竞争优势的过程。它不仅涉及技术的变革,还包括企业文化、组织结构和业务流程的全面调整。数字化转型的核心在于利用
    的头像 发表于 12-22 11:44 1683次阅读

    python中数字字符和数字何不同

    数字字符和数字值在Python中有着明显的区别。数字字符是指代表数字的字符,如'1'、'2'、'3',而数字值则是实际的数值,如1、2、3。
    的头像 发表于 11-22 09:51 1585次阅读