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

    浏览量

    14683
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

    工业数字化改造哪些前提

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

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

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

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

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

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

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

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

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

    不同行业的数字工厂哪些特点和差异?

    各行业的独特差异也将持续推动定制化解决方案的创新,以满足不同行业日益增长的数字化转型需求。对于设备管理系统而言,需要深入理解各行业数字工厂的特点和差异,针对性地进行优化和升级,为各行业数字工厂的稳定运行和高效发展提供坚实保障。
    的头像 发表于 04-17 10:29 555次阅读
    不同行业的<b class='flag-5'>数字</b>工厂<b class='flag-5'>有</b>哪些特点和差异?

    不到千元即可拥有专属数字人!华为云 Flexus 数字人应用范围多广?

    随着技术的进步,用户对数字人的互动性和个性化需求也在增加,倒逼行业不断优化技术创新与产品研发。但数字人的制作涉及多个环节,从基础的建模到动画制作,再到最终的渲染,这一过程中数字人的外观、身体结构以及
    的头像 发表于 03-10 11:04 717次阅读
    不到千元即可拥有专属<b class='flag-5'>数字</b>人!华为云 Flexus <b class='flag-5'>数字</b>人应用范围<b class='flag-5'>有</b>多广?

    数字电路哪些特点和作用

    在电子技术领域,数字电路具有一系列鲜明的特点,这些特点使其在众多应用场景中发挥关键作用,推动着现代科技不断向前发展。 信号的离散性是数字电路最为突出的特点之一。数字电路所处理的数字信号
    的头像 发表于 02-04 17:17 1570次阅读

    数字化仪的工作方式哪些

    数字化仪,作为一种将图像(胶片或像片)和图形(包括各种地图)的连续模拟量转换为离散的数字量的装置,是专业应用领域中一种用途非常广泛的图形输入设备。本文将深入探讨数字化仪的多种工作方式,包括其技术原理、操作特点以及应用领域。
    的头像 发表于 01-30 15:27 1562次阅读

    数字电压表概述_数字电压表的作用

    数字电压表(Digital Voltmeter,简称DVM)是一种采用数字化测量技术,将连续的模拟量转换成不连续、离散的数字形式并加以显示的电子仪器。以下是对数字电压表的详细概述:
    的头像 发表于 01-28 14:14 2266次阅读

    ADS5401模拟供电数字供电,但是地却只有一个,不分模拟和数字,这样的话应该怎么接?

    ADS5401模拟供电和数字供电,但是地却只有一个,不分模拟和数字,这样的话应该怎么接?我们这个板子上数字地和模拟地是分开的,这样不好搞啊。我们模拟前端是用的一个放大器把单端转差分
    发表于 01-22 08:29