当前位置: 代码迷 >> 综合 >> 1505. 最多 K 次交换相邻数位后得到的最小整数 贪心+树状数组
  详细解决方案

1505. 最多 K 次交换相邻数位后得到的最小整数 贪心+树状数组

热度:18   发布时间:2024-02-19 21:38:28.0

贪心每次放最小的数在最前面。

每次一个数放前面后,其后面的数移动到最前面的次数就减一。

可以单点更新区间查询,或者区间更新单点查询,显然前者码量更小

const int M = 1e5+7;
class Solution {
public:char s[M]; int a[M],c[M],vs[M];vector<int>v[M];int p[M],n;void up(int x,int d){while(x<=n){c[x]+=d;x+=x&(-x);}}int qu(int x){int ans=0;while(x){ans+=c[x];x-=x&(-x);}return ans;}string minInteger(string s, int k) {n=s.length();string pr;for(int i=1;i<=n;i++){a[i]=s[i-1]-'0';v[a[i]].push_back(i);if(i>1)up(i,1);}for(int i=1;i<=n;i++){for(int j=0;j<=9;j++){if(v[j].size()<=p[j])continue;int pos=v[j][p[j]],z=qu(pos);if(z<=k){k-=z;vs[pos]=1;up(pos,-1);pr+=(a[pos]+'0'); p[j]++;break;}}}for(int i=1;i<=n;i++)if(!vs[i])pr+=(a[i]+'0');return pr;}
};