力扣比赛 5455. 最多 K 次交换相邻数位后得到的最小整数

给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。

你可以交换这个整数相邻数位的数字 最多 k 次。

请你返回你能得到的最小整数,并以字符串形式返回。

示例 1:

输入:num = “4321”, k = 4 输出:“1342” 解释:4321 通过 4 次交换相邻数位得到最小整数的步骤如上图所示。
在这里插入图片描述

示例 2:

输入:num = “100”, k = 1 输出:“010” 解释:输出可以包含前导 0 ,但输入保证不会有前导 0 。

示例 3:

输入:num = “36789”, k = 1000 输出:“36789” 解释:不需要做任何交换。

示例 4:

输入:num = “22”, k = 22 输出:“22”

示例 5:

输入:num = “9438957234785635408”, k = 23 输出:“0345989723478563548”

提示:

1 <= num.length <= 30000
num 只包含 数字 且不含有 前导 0 。
1 <= k <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-possible-integer-after-at-most-k-adjacent-swaps-on-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

使用贪心法,每次在不超过k次交换中尽量找到最小的数字进行交换,直到k为0。
class Solution {
public:
    string minInteger(string num, int k) {

           if(k==0)
            return "";
           if(num.size()*num.size()<k)
           {//k值大于数组大小的平方直接返回排序后的字符串
             sort(num.begin(),num.end());
             return num;
           }
           

            int cur = 0,next = 0;
            for(int i = 0; i < num.length(); i++)
            {
               int index = 0;
               bool flag=false;
               int tmp = num[i];
               for(int m=i+1;m<i+1+k && m<num.size();m++)
               {//寻找最小的数
                   if(tmp>num[m]) 
                   {
                       tmp = num[m];
                       index = m;
                       flag = true;
                   }                  
               }
               
               if(flag)
               {
                    for(int j = index;j>=1;j--)
                    {
                        if(num[j]<num[j-1]) 
                        {
                            swap(num[j],num[j-1]);          
                             k--;
                        }
                        if(k==0)return num;
                    } 
                    flag = false;
               }               
            }

            return num;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼儿LY

一切随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值