给你一个字符串 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;
}
};