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

    浏览量

    14750
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27463

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    科技亮相2026数字设备与创新博览会

    2026 年 1 月,震亮相在达卡举办的 Digital Device & Innovation Expo 2026(数字设备与创新博览会)。本届展会于 1 月 28 日至 31 日举行
    的头像 发表于 02-01 09:13 1094次阅读

    LT1365高速运算放大器:性能特性与应用指南

    LT1364/LT1365高速运算放大器:性能特性与应用指南 在电子设计领域,高速运算放大器是实现高性能电路的关键组件。今天,我们来深入探讨Linear Technology Corporation
    的头像 发表于 01-29 16:20 230次阅读

    TFP410-EP:数字显示传输的理想之选

    一款产品,它能很好地满足当前市场对于数字显示传输的需求。今天就和大家详细分析一下这款产品的特性和相关设计要点。 文件下载: tfp410-ep.pdf 二、TFP410-EP 概述 TFP410-EP
    的头像 发表于 12-27 14:10 635次阅读

    数字工牌是什么?数字工牌录音方案设计

    一些内容,但是如果有数字工牌同时开启了录音,这个时候就可以回放一下和客户沟通的内容,方便进一步去跟进客户需求。   数字工牌的核心功能需求是什么? 市面上的数字工牌带录音的、
    的头像 发表于 12-01 16:41 537次阅读
    <b class='flag-5'>数字</b>工牌是什么?<b class='flag-5'>数字</b>工牌录音方案设计

    基于XL4016的单片机数字直流稳压电源板

    10mV,电流小于10mA。 不同于传统的电位器调节稳压输出,数字设置的稳压电源,其关键在于电路能正确体现要求。一个数字稳压电源,一般以下部分:能电子调节的稳压部分,ADC部分,DA
    发表于 11-10 20:06

    数字化与信息化什么区别和联系

    数字化与信息化是紧密相关但又有区别的两个概念,它们在推动社会和经济发展中扮演着不同角色。以下从定义、核心目标、技术基础、应用范围、实施路径及相互联系六个方面进行详细分析: 一、定义差异 数字
    的头像 发表于 10-11 16:48 1825次阅读
    <b class='flag-5'>数字</b>化与信息化<b class='flag-5'>有</b>什么区别和联系

    掌握数字设计基础:迈向芯片设计的第一步

    数字电路分为两类: 组合逻辑(Combinational Logic):仅依赖当前输入直接产生输出,比如加法器、编码器。 时序逻辑(Sequential Logic):具备存储特性,能记忆历史状态,比如
    发表于 10-09 21:11

    什么是数字万用表?

    电子设备的状况需要使用测量仪器来确定。对于无法目测来确定状态的电子设备,建议使用数字万用表进行测量。本节将详细介绍诸如“数字万用表是什么?”“数字万用表与模拟万用表区别吗?”等
    的头像 发表于 08-18 10:00 2524次阅读
    什么是<b class='flag-5'>数字</b>万用表?

    工业数字化改造哪些前提

    工业数字化改造是通过数字技术(如物联网、大数据、人工智能、云计算等)对传统工业生产、管理、运营模式进行全面升级的过程。其前提条件涉及技术、管理、人才、资金、基础设施等多个维度,需系统性布局才能确保
    的头像 发表于 07-08 10:20 893次阅读

    基于LockAI视觉识别模块:手写数字识别

    评分等场景。这项技术不仅提高了数据处理的速度和准确性,还极大地简化了输入流程,为金融、邮政和教育等行业带来了显著的便利。 1.2 手写数字识别常用方法 目前,实现手写数字识别方法很多,常用的方法如下
    发表于 06-30 16:45

    Analog Devices / Maxim Integrated MAX22193四通道工业数字输入数据手册

    Analog Devices MAX22193四通道工业数字输入 将四个24V工业数字输入转换为四个CMOS逻辑兼容的并行输出。所有四个通道的输入至输出传播延迟小于300ns。与传统的阻性输入相比
    的头像 发表于 06-18 15:36 965次阅读
    Analog Devices / Maxim Integrated MAX22193四通道工业<b class='flag-5'>数字</b>输入数据手册

    实用电子电路设计(全6本)—— 数字系统设计

    由于资料内存过大,分开上传,需要的朋友可以去主页搜索下载哦~ 本文内容主要分为两部分: 第一部分是以数字技术的思维方法作为主体论述; 第二部分是从实践角度出发,对数字技术实际应用方法进行详细介绍
    发表于 05-15 15:25

    通用电路图--第3卷 通用数字电路

    学习当前各种实际的电路的资料,介绍了各种家电、通用模拟、通用数字、测量与传感、通信、特殊六大类的电路。 是实际操练的很好借鉴。 纯分享贴,需要可以直接下载附件获取完整资料! (如果内容
    发表于 05-06 15:25

    模拟地和数字地混合PCB布局探讨

    这是我的产品目前的电路拓扑,一些疑问想跟大佬们共同探讨一下。 图1,模拟地和数字地分开,在电源入口处相连,红色是模拟地的连接示意,绿色为数字电流的返回路径。此方案感觉不妥当的是数字
    发表于 04-29 22:35