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:

来自左程云

灵捷3.5

大体过程如下:

给定一个整数数组 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]` 表示在的更多相关文章

  1. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  2. 请使用迭代查找一个list中最小和最大值,并返回一个tuple

    如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 在Python中,迭代是通过for ... in来完成的,而很多语 ...

  3. Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值

    第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...

  4. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

  5. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列

    11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...

  6. Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型

    11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...

  7. 【转载】让c++ 函数返回一个数组

    在c++中是不允许数组作为函数的返回值的 int [] someFunction( ); //ILLEGAL 要想实现函数返回一个数组,那返回对应数组里面类型的指针 you must return a ...

  8. python 练习题:使用迭代查找一个list中最小和最大值,并返回一个tuple

    # -*- coding: utf-8 -*- # 请使用迭代查找一个list中最小和最大值,并返回一个tuple from collections import Iterable def findM ...

  9. Python--遍历文件夹下所有文件和目录的方法(os.walk(rootdir)函数返回一个三元素元祖)

    import os import os.path # This folder is custom rootdir = '/Users/macbookpro/Desktop/test' for pare ...

  10. array_flip() 函数返回一个反转后的数组

    定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错 ar ...

随机推荐

  1. .NET应用国际化支持-葡萄牙语下如何不区分重音的模糊查询

    葡萄牙语,作为一种罗曼语族的语言,其正字法(orthography)并不使用音标系统来标记发音,而是有一套特定的拼写规则.然而,葡萄牙语中确实使用重音符号(acentos)来标记某些元音的重音(str ...

  2. Ubuntu上文件系统根目录磁盘空间扩充

    今天使用Ubuntu的时候,出现了磁盘根目录空间不足的提示,需要我们对于根目录磁盘空间进行扩充. 1.打开终端输入命令,安装gparted管理器 sudo apt-get install gparte ...

  3. Mac下使用Docker快速布署FastGPT实现AI私有知识库

    FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理.模型调用等能力.同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 官网地址为:https: ...

  4. gcc编译stm32 f103出现错误init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'

    解决方法: 方法一:去掉makefile中的编译选项:-nostartfiles 方法二:方法一不凑效的情况下,添加编译选型:--specs=nano.specs

  5. Access注入-偏移注入

    Access注入-偏移注入 1.偏移注入使用场景及方法 一.偏移注入使用场景及方法 偏移注入使用的场景 1)在sql注入时遇到无法查询数据库字段名时,比如系统自带的数据权限不够无法访问系统自带库 2) ...

  6. 怎样给U盘加密

    给U盘加密其实很简单,下载一个叫U盘超级加密3000的U盘加密软件就可以了. 这款U盘加密的软件最大的特点是不用安装,只要一个exe文件.你把它放到你需要加密的U盘里,就可以加密U盘里的数据了.并且到 ...

  7. 在winform中如何实现双向数据绑定?

    什么是双向数据绑定? 双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步.这意味着当模型数据发生变化时,UI会自动更新,反之亦然.这种双向数据绑定极大地简 ...

  8. 记录--微信调用jssdk--Invalid Signature, updateAppMessageShareData: denied等问题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近在做安卓内嵌入H5活动页拉新活动,遇到的棘手问题记录下, 一是为了日后遇到同样问题好回顾,二是希望能帮到有同样问题的兄弟. 废话不多说 ...

  9. C# OpenCvSharp 提取文字区域

    效果 项目  代码 using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  10. KingbaseES V8R6 等待事件之IO类BufFileRead BufFileWrite

    等待事件含义 当数据库创建临时文件时,会发生IO:BufFileRead和IO:BufFileWrite等待事件.当操作需要的内存比当前定义的work_mem内存参数更多时,会将临时数据写入磁盘永久存 ...