首页 > 其他分享 >2024-04-13:用go语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts`。 满足以下条件:对于每个 `nums[i]`, `counts[i]` 表示在

2024-04-13:用go语言,给定一个整数数组 `nums`, 请编写一个函数,返回一个新的数组 `counts`。 满足以下条件:对于每个 `nums[i]`, `counts[i]` 表示在

时间:2024-04-13 22:12:24浏览次数:23  
标签:nums int res 数组 sorted counts bit

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))

在这里插入图片描述

标签:nums,int,res,数组,sorted,counts,bit
From: https://www.cnblogs.com/moonfdd/p/18133468

相关文章

  • 通俗易懂的KMP理论讲解(含手求Next数组)
    通俗易懂的KMP理论讲解(含手求Next数组)1.KMP算法介绍KMP算法的核心是利用匹配失败后的信息,通过一个next数组,保存模式串中前后最长公共子序列的长度,尽量减少模式串与主串的匹配次数降低时间复杂度以达到快速匹配的目的。2.字符串的前后缀与公共前后缀2.1字符串的前缀字符串的......
  • 2019年蓝桥杯省赛-修改数组(并查集)
    0.题目时间限制:1.0s内存限制:256.0MB本题总分:20分【问题描述】给定一个长度为N的数组A=[A1,A2,···AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,···,AN。当修改Ai时,小明会检查......
  • 二维字符串数组的传参时与指针互转时的问题
    二维数组如何传参二维字符串数组,转char**会导致的问题,以及编译报错要想得到正确的结果,需要按如下方式去写传参:#include<stdio.h>#include<string.h>//intchar_arr_copy(char**dest)//这样定义传参类型将导致编译报错,在低版本的编译器下或者没有报错但是得不到正确......
  • 数组搜索和位置方法总结(indexOf()、lastIndexOf()、includes()、find()、findIndex())
    1.严格相等(indexOf()、lastIndexOf()、includes())这三个方法都接受两个参数(要查找的元素、可选的起始搜索位置)indexOf()、includes()从数组第一项往后搜索,lastIndexOf()从数组最后一项往前开始搜索indexOf与lastIndexOf返回要查找的元素在数组中的位置,如果没有找到返回-1,incoude......
  • C语言09-指针(指针数组、数组指针、字符指针),值传递和引用传递,指针和函数,注释写法
    第12章指针pointer12.3指针和数组①数组名可以把数组名当做是存储了首元素地址的常量。//arr的类型表示为int[5]intarr[5]={10,20,30,40,50};②指针数组指针数组(PointerArray)是一个数组,其中的每个元素都是指针。intnum1=10,num2=20,num3=30;//ptr_......
  • Java创建数组、赋值的四种方式,声明+创建+初始化 详解
    Java创建数组、赋值的四种方式,声明+创建+初始化详解@目录一、创建数组的四种方式二、详解三、数组存储的弊端一、创建数组的四种方式以int数据类型为例@TestpublicvoidtestNewArray(){//创建数组//法一int[]arr1=newint[]{1,2,3,4,5};System.ou......
  • Java中Array.sort()的几种用法简明教程 (需要初始化要排序的对象)对 一个数组的所有元素
    Java中Array.sort()的几种用法简明教程(需要初始化要排序的对象)对一个数组的所有元素进行排序,并且是按从小到大的顺序Java中Array.sort()的几种用法简明教程(需要初始化要排序的对象)======================================================1、Arrays.sort(int[]a)......
  • 超详细!详解一道高频算法题:数组中的第 K 个最大元素
    超详细!详解一道高频算法题:数组中的第K个最大元素今天分享的题目来源于LeetCode第215号问题,是面试中的高频考题。题目描述在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。......
  • leedcode-两个数组的交集
    自己写的:fromtypingimportList#导入List类型,用于函数参数和返回类型的注解classSolution:defintersection(self,nums1:List[int],nums2:List[int])->List[int]:#初始化一个空列表,用于存储两个列表的交集mylist=[]#遍历num......
  • LeetCode 2439. 最小化数组中的最大值
    给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。每一步操作中,你需要:选择一个满足 1<=i<n 的整数 i ,且 nums[i]>0 。将 nums[i] 减1。将 nums[i-1] 加1。你可以对数组执行 任意 次上述操作,请你返回可以得到的 nums 数组中 最大值......