2024-04-13:用 go 语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts`。 满足以下条件:对于每个 `nums[i]`, `counts[i]` 表示在
2024-04-13:用 go 语言,给定一个整数数组 nums
,
请编写一个函数,返回一个新的数组 counts
。
满足以下条件:对于每个 nums[i]
,
counts[i]
表示在 nums[i]
右侧且比nums[i]
小的元素数量。
输入:nums = [5,2,6,1]。
输出:[2,1,1,0] 。
答案 2024-04-13:
来自左程云。
大体过程如下:
给定一个整数数组 nums
,首先创建一个与 nums
大小相同的临时数组 sorted
,并将 nums
的元素复制到 sorted
中。然后对 sorted
进行排序,得到按升序排列的新数组。
接下来,创建一个映射 rank
,用于记录每个数在排序后数组中的排名。遍历排序后的数组,将排名存储到 rank
中。注意,排名从 1 开始。
接着创建一个 bit
数组,长度为 n+2
,并定义一个函数 lowbit
,它可以计算一个数的二进制表示中最低位的 1 的值。再定义一个函数 query
,用于查询比给定排名小的元素数量。函数内部使用循环将 bit
数组的前缀和累加到结果中,直到排名为 0。还定义一个函数 update
,用于更新 bit
数组中对应排名的计数值。
然后创建一个结果数组 ans
,初始化为全 0。从右向左遍历原始数组 nums
,获取当前元素在排序后数组中的排名 r
,通过调用 query
函数获得在当前元素右侧且小于它的元素数量,并将结果存储到 ans
中。同时,调用 update
函数更新 bit
数组中排名为 r
的计数值。
最后返回结果数组 ans
。
总的时间复杂度为 O(nlogn),其中 n 为数组的大小,主要由排序操作决定。总的额外空间复杂度为 O(n),用于存储临时数组和映射等辅助空间。
Go 完整代码如下:
Python 完整代码如下:
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/016190b8310018940b79a0d13】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论