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

    文章

    79

    浏览量

    14303
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25688

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

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

收藏 人收藏

    评论

    相关推荐

    采用NT33510显示屏,如何通过矩阵键盘更改显示屏上的数字内容?

    我想实现一个这样的功能:我的LCD当前显示的是:新年快乐!2018! 想通过矩阵键盘将2018更改成2019,这个过程首先通过矩阵键盘上的左键移动到数字“8”上,然后在通过矩阵键盘将数字“8”更改为
    发表于 04-24 08:10

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

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

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

    车规级一体成型电感 VSAB1365-220M 感量22μH,饱和电流6.4A,尺寸13.45×12.6×6.30mm
    发表于 01-08 09:32 1次下载

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

    车规级一体成型电感 VSAB1365-150M 感量15μH,饱和电流7.2A,尺寸13.45×12.6×6.30mm
    发表于 01-08 09:31 0次下载

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

    车规级一体成型电感 VSAB1365-100M 感量10μH,饱和电流9A,尺寸13.45×12.6×6.30mm
    发表于 01-08 09:31 2次下载

    车规级一体成型电感 VSAB1365-8R2M产品手册

    车规级一体成型电感 VSAB1365-8R2M 感量8.2μH,饱和电流10A,尺寸13.45×12.6×6.30mm
    发表于 01-08 09:30 1次下载

    车规级一体成型电感 VSAB1365-6R8M产品手册

    车规级一体成型电感 VSAB1365-6R8M 感量6.8μH,饱和电流10.5A,尺寸13.45×12.6×6.30mm
    发表于 01-08 09:30 0次下载

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

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

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

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

    大功率数字电源的优缺点

    大功率数字电源的优缺点 一、引言 数字电源是一种能够提供稳定、可靠、高效、精确电压与电流输出的电源设备。数字电源分为低功率(小于100W)与大功率(大于100W)
    的头像 发表于 10-16 16:25 721次阅读

    数字电源怎么使用 数字电源怎么调电压

    数字电源怎么使用 数字电源怎么调电压 数字电源是一种智能化的电源,它可以根据我们的需要自动调整输出电压和负载电流。数字电源的使用方法相对较为简单,只需按照以下步骤操作即可。 一、开机
    的头像 发表于 10-16 16:16 2002次阅读

    数字信号处理的FPGA实现

    FPGA正在掀起一场数字信号处理的变革。本书旨在讲解前端数字信号处理算法的高效实现。首先概述了当前的FPGA技术、器件以及用于设计最先进DSP系统的工具。第1章的案例研究是40多个设计示例
    发表于 09-19 06:38

    什么是数字钥匙 数字钥匙概念

    什么是数字钥匙? 数字钥匙概念拆解 1.钥匙数字化:数字钥匙从字面上去理解,是将传统的物理钥匙转化数字形式。这里的
    的头像 发表于 09-13 15:09 5406次阅读

    数字孪生”十问十答

    文|北京航空航天大学,自动化科学与电气工程学院,数字孪生研究组来源|先进制造业本文对以下十个问题进行了深入分析与思考,以期抛砖引玉,为研究者更好理解数字孪生,为决策者理性和正确对待数字孪生,为实践者
    的头像 发表于 09-13 08:32 672次阅读
    “<b class='flag-5'>数字</b>孪生”十问十答

    数字化业务中台的核心技术哪些?#数字化转型 #光点科技

    数字
    光点科技
    发布于 :2023年09月04日 09:33:36