题目描述:给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。你可以交换这个整数相邻数位的数字 最多 k 次。请你返回你能得到的最小整数,并以字符串形式返回。
解题思路:从高位到低位遍历每一个位置,每一次都贪心的让更小的数字占据更高的位置,过程中需要判断交换的次数是否在k(每次交换之后剩下的次数)之内,这里通过一个树状数组来维护从当前位置往后一共向前移动过多少个数字,用来得到最终交换到特定位置需要的次数,代码如下:
class BIT(object):
def __init__(self, n):
self.n = n
self.tree = [0] * (n +1)
def update(self, i):
while i <= self.n:
self.tree[i] += 1
i += (i & -i)
def search(self, i):
ans = 0
while(i > 0):
ans += self.tree[i]
i -= (i & -i)
return ans
def rangefrom(self, start, end):
start_sum = self.search(start-1)
end_sum = self.search(end)
return end_sum - start_sum
class Solution:
def minInteger(self, num: str, k: int) -> str:
size = len(num)
pos = [list() for _ in range(10)]
for i in range(size-1, -1, -1):
pos[ord(num[i])-ord('0')].append(i+1)
bit = BIT(size)
ans = ""
for i in range(1, size+1):
for j in range(10):
if pos[j]:
dis = pos[j][-1]
behind = bit.rangefrom(dis+1, size)
true_dis = dis + behind - i
if true_dis <= k:
ans += str(j)
bit.update(dis)
pos[j].pop()
k -= true_dis
break
return ans