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完整代码如下:
package main
import (
"fmt"
"sort"
)
func countSmaller(nums []int) []int {
n := len(nums)
sorted := make([]int, n)
copy(sorted, nums)
sort.Ints(sorted)
rank := make(map[int]int)
for i, num := range sorted {
rank[num] = i + 1
}
bit := make([]int, n+2)
lowbit := func(x int) int {
return x & -x
}
query := func(x int) int {
res := 0
for x > 0 {
res += bit[x]
x -= lowbit(x)
}
return res
}
update := func(x int) {
for x <= n+1 {
bit[x]++
x += lowbit(x)
}
}
ans := make([]int, n)
for i := n - 1; i >= 0; i-- {
r := rank[nums[i]]
ans[i] = query(r - 1)
update(r)
}
return ans
}
func main() {
nums := []int{5, 2, 6, 1}
fmt.Println(countSmaller(nums))
}

Python完整代码如下:
# -*-coding:utf-8-*-
def count_smaller(nums):
n = len(nums)
sorted_nums = sorted([(num, i) for i, num in enumerate(nums)])
rank = {sorted_nums[i][0]: i + 1 for i in range(n)}
bit = [0] * (n+2)
def lowbit(x):
return x & -x
def query(x):
res = 0
while x > 0:
res += bit[x]
x -= lowbit(x)
return res
def update(x):
while x <= n + 1:
bit[x] += 1
x += lowbit(x)
ans = [0] * n
for i in range(n-1, -1, -1):
r = rank[nums[i]]
ans[i] = query(r - 1)
update(r)
return ans
nums = [5, 2, 6, 1]
print(count_smaller(nums))

2024-04-13:用go语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts`。 满足以下条件:对于每个 `nums[i]`, `counts[i]` 表示在的更多相关文章
- 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
/** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...
- 请使用迭代查找一个list中最小和最大值,并返回一个tuple
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 在Python中,迭代是通过for ... in来完成的,而很多语 ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签
今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型
11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...
- 【转载】让c++ 函数返回一个数组
在c++中是不允许数组作为函数的返回值的 int [] someFunction( ); //ILLEGAL 要想实现函数返回一个数组,那返回对应数组里面类型的指针 you must return a ...
- python 练习题:使用迭代查找一个list中最小和最大值,并返回一个tuple
# -*- coding: utf-8 -*- # 请使用迭代查找一个list中最小和最大值,并返回一个tuple from collections import Iterable def findM ...
- Python--遍历文件夹下所有文件和目录的方法(os.walk(rootdir)函数返回一个三元素元祖)
import os import os.path # This folder is custom rootdir = '/Users/macbookpro/Desktop/test' for pare ...
- array_flip() 函数返回一个反转后的数组
定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错 ar ...
随机推荐
- [C++] epoll编写的echo服务端
直接贴代码,代码是运行在Linux上面的,通过 g++ epoll.cpp编译 #include <sys/socket.h> #include <sys/epoll.h> # ...
- Pod中断预算 PodDisruptionBudget(PDB)
PodDisruptionBudget(PDB)是Kubernetes中的一个资源对象,用于确保在进行维护.升级或其他操作时,系统中的Pod不会被意外中断或终止.PDB提供了一种机制,通过限制在给定时 ...
- 基于stm32H730的解决方案开发之点亮第一个LED灯
一 概述 STM32H730超值系列内含ArmCortex-M7内核(具有双精度浮点单元),工作频率可达550 MHz.内嵌的128 KB闪存使意法半导体能够为开发人员提供一种经济划算的解决方案.凭借 ...
- Python爬虫实战系列2:虎嗅网24小时热门新闻采集
一.分析页面 打开虎嗅网,点击[24小时] 本次采集,我们以这24小时的热门新闻为案例. 1.1.分析请求 F12打开开发者模式,然后点击Network后点击任意一个请求,Ctrl+F开启搜索,输入标 ...
- kettle教程--通过配置文件同步所需要的列数据
kettle教程--通过配置文件同步所需要的列数据 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「kettle」, 免费领取全网最热的kettle实战视频教程 ht ...
- UE像素流送是什么?像素流推流原理介绍
游戏开发者通常在运行游戏逻辑时会将游戏渲染到屏幕的同一台设备上来运行虚幻引擎应用,多人联网游戏可能会在应用程序的多个实例之间分发部分游戏逻辑,但每个单独的实例仍然会为自己的玩家在本地渲染游戏.即使是使 ...
- Linux快速入门(四)Linux用户管理
root用户和普通用户 虽然root用户的的权限很大,但一般情况下,我们都不会直接使用root用户而是创建一个普通用户,这样可以避免因为权限过大带来的一些误操作,当使用一些需要权限的操作时,可以使用s ...
- Linux快速入门(一)Linux基础知识
我的环境:Ubuntu(后面涉及到的Linux均为Debian系列) Linux不同发行版的包管理方式 (1)Redhat系列:Redhat系列的包管理方式采用的是基于RPM包的YUM包管理方式 (2 ...
- vscode插件设置——Golang开发环境配置
适用读者: Go初学者, 到这里, 你应该是处于已经完成了 go 的安装之后, 准备写个 "Hello Gopher" 之前. 本篇力求给初学者-未来的Gopher 们 一个正确的 ...
- 分析性能差的sql
--EXECUTIONS 所有子游标的执行这条语句次数 --DISK_READS 所有子游标运行这条语句导致的读磁盘次数 --BUFFER_GETS 所有子游标运行这条语句导致的读内存次数 --Hit ...