leetcode6121

裁剪数字后查询第k小的数字

题目给的数字是字符串,而且长度可以达到100。可以采用基数排序,开辟一个二维数组,从低位开始存储,arr[i][j]表示在nums[i]从右数第i位的所有数字中的第j小的下标。

例如对于数字:123,654,491.

对应的arr如下:

arr[1] = {2,0,1}

arr[2] = {0,1,2}

arr[3] = {0,2,1}

每一轮存储的数字放在一个桶中。然后在依次将桶中的结果连接起来,最后再通过根据queries数组得出结果。

 

func smallestTrimmedNumbers(nums []string, queries [][]int) []int {
    n := len(nums)
    m :=len(nums[0])
    //arr表示 [从右数第i位的所有数字] 中的  [第j小数字] 对应的 [下标]
    arr:= make([][]int, m+1)
    
    //先存入所有下标,便于对右数第一位的所有数字进行排序
    for i:=0;i<n;i++{
        arr[0] = append(arr[0], i)
    }
    for i:=1; i<=m;i++{
        temp := make([][]int, 10)
        //在第i-1位的的基础之上进行排序,根据在nums中右数第i位依次放入桶中
        for _, v := range arr[i-1]{
            temp[nums[v][m-i] - '0'] = append(temp[nums[v][m-i]-'0'], v )
        }

        for j:=0;j<10;j++{
            for _,v :=range temp[j]{
                arr[i] = append(arr[i], v)
            }
        }
    }

    ans := []int{}
    for _,q:=range queries{
        //数组下标从0开始,故第k小需要减去1
        ans = append(ans, arr[q[1]][q[0]-1])
    }
    return ans
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值