题目给的数字是字符串,而且长度可以达到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
}