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

2024-05-15 23:28
文章标签 数字 小于 当前

本文主要是介绍有多少小于当前数字的数字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:https://leetcode.cn/problems/how-many-numbers-are-smaller-than-the-current-number/description/

思路:

最简单的思路来说,就是双重for循环进行遍历,来判断个数,

优化思路,其中一个思路就是递推 + 哈希思想,哈希到数组之后,递推加起前面的所有数字,最后减去本身。

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

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

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

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

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

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

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

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

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

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

class Solution {public int[] smallerNumbersThanCurrent(int[] nums) {int[] cnt = new int[101];int n = nums.length;for (int i = 0; i < n; i++) {cnt[nums[i]] ++;}for (int i = 1; i <= 100; i++) {cnt[i] += cnt[i - 1];}int[] ret = new int[n];for (int i = 0; i < n; i++) {ret[i] = nums[i] == 0 ? 0 : cnt[nums[i] - 1];}return ret;}
}
public int[] smallerNumbersThanCurrent(int[] nums) {Map<Integer, Integer> map = new HashMap<>(); // 记录数字 nums[i] 有多少个比它小的数字int[] res = Arrays.copyOf(nums, nums.length);Arrays.sort(res);for (int i = 0; i < res.length; i++) {if (!map.containsKey(res[i])) { // 遇到了相同的数字,那么不需要更新该 number 的情况map.put(res[i], i);}}for (int i = 0; i < nums.length; i++) {res[i] = map.get(nums[i]);}return res;}

这篇关于有多少小于当前数字的数字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993224

相关文章

0828一边写猜数字的小游戏,一边复习拉~

这是一个统计得分的猜数字游戏~ 写的过程中我遇到每个概念都去翻笔记,然后写注释,这样又复习又有意思。 所以别嫌我注释啰嗦啦~.还好当初在这里做了笔记的记录

找出缺失和重复的数字

问题 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个下标从 0 开始、长度为 2 的整数数组 ans ,其中 ans[0] 等于 a ,ans[1] 等于 b 。 示例 示例 1: 输入:grid = [

将字符和数字分离

1.可以使用正则表达式: select regexp_replace(a,'[0-9]',' ') d,        regexp_replace(a,'[^0-9]',' ') e from table; 注:[0-9]一种表示方式,代表[0123456789],还可以写成[[:digit:]];"^"表示否定 2.translate select translate(a,'w0

揭秘数字货币:比特币背后的技术逻辑

随着科技的飞速发展,数字货币作为一种新兴的经济形态,已经逐渐走入我们的视野。其中,比特币无疑是这一领域的佼佼者。那么,比特币背后的技术逻辑究竟是什么呢?本文将为您揭开这一神秘面纱。 一、区块链技术:比特币的基石 比特币的核心技术就是区块链(Blockchain)。区块链是一种分布式数据库,它采用去中心化的方式,将数据以区块的形式进行存储和传输。每个区块都包含了一定数量的交易记录,并通过密码

【教学类-60-01】彩色消划掉01(四个数字,X*Y宫格)

背景需求: 🧠思维启蒙 - 小红书注意力训练小分享-彩色划消 训练孩子的视觉辨别能力、视觉稳定性、注意力分配额能力👀 一起来试试吧~ #分享学习方法 #注意力训练 #专注力训练#天津 #亲子时光 #孩子成长 #思维启蒙 #数学思维启蒙 #早教启蒙 #数学启蒙这样做 #科学思维 #科学思维训练https://www.xiaohongshu.com/explore/65d453e3000

景源畅信数字:抖音新手如何找好自己的发布领域?

在短视频的浪潮中,抖音以其独特的魅力吸引了众多用户。对于刚踏入这个平台的新手来说,找到适合自己的发布领域至关重要。那么,如何在这个充满竞争的平台上找到自己的定位呢?接下来,就让我们一起来探讨这个问题。   一、明确兴趣爱好与特长要找到适合自己的发布领域,首先要从自己的兴趣爱好和特长出发。每个人都有自己擅长的领域,可以是烹饪、舞蹈、唱歌、手工制作等等。只有选择自己感兴趣的领域,才能保持持续

数字孪生技术可以给工厂带来哪些帮助?

随着人工智能、大数据、云计算等技术的不断成熟,各行各业开始意识到数字化转型的重要性,数字孪生作为其重要组成部分逐渐受到关注。特别是在制造业、建筑业等领域,通过数字孪生技术可以实现虚拟仿真、预测分析,提高生产效率和产品质量。 随着全球经济联系日益紧密,企业间竞争日益激烈,数字孪生提供了一种创新的方式来优化生产流程、降低成本,提高竞争力。因此,数字孪生作为未来数字经济发展的重要引擎,将在不同领域中发

远程工作/线上兼职网站整理(数字游民友好)

文章目录 国外线上兼职网站fiverrupwork 国内线上兼职网站甜薪工场猪八戒网云队友 国外线上兼职网站 fiverr https://www.fiverr.com/start_selling?source=top_nav upwork https://www.upwork.com/ 国内线上兼职网站 甜薪工场 https://www.txgc.com

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。 使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如

delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。 使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。

android定位:获取当前位置的经纬度

Android定位主要使用的是基于位置服务(Location Based Service)技术,有了 Android 系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操作,比如定位城市,根据我们当前的位置,查找要去的目的地的路线等等,因此,现在几乎开发的每一款互联网app产品都有定位功能,好了,现在我们开始学习简单的定位。 效果图: 代码: