1505. 最多 K 次交换相邻数位后得到的最小整数

题目描述:给你一个字符串 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值