2938. 区分黑球与白球
思路:方法一,最小的移动次数,归并排序。
class Solution {
public:
long long cnt=0;
void merge_sort(int l,int r,string &s){
if(l>=r) return;
int mid=(l+r)/2;
merge_sort(l,mid,s);
merge_sort(mid+1,r,s);
string tmp="";
int i=l,j=mid+1;
while(i<=mid&&j<=r){
if(s[i]<=s[j]){
tmp.push_back(s[i++]);
}else{
cnt+=mid-i+1;
tmp.push_back(s[j++]);
}
}
while(i<=mid){
tmp.push_back(s[i++]);
}
while(j<=r){
tmp.push_back(s[j++]);
}
for(int i=l;i<=r;i++){
s[i]=tmp[i-l];
}
}
long long minimumSteps(string s) {
merge_sort(0,s.size()-1,s);
return cnt;
}
};
思路:方法二,贪心。遍历字符串s时,只需要记录已经遍历过的部分出现1的次数cnt,然后遇到0,就将sum+=cnt。理由,每一个0肯定要和它前面的1进行互换。
class Solution {
public:
long long minimumSteps(string s) {
long long sum=0;
int cnt=0;
for(int i=0;i<s.size();i++){
if(s[i]=='1') cnt++;
else sum+=cnt;
}
return sum;
}
};