我的想法是可以先从右往左遍历,这样碰到的黑球的右边肯定是白球,这样就不影响黑球的移动,如何移动的距离是当前右边第一个白球的位置减去该黑球的位置。
这里right
记录的是右边第一个白球所在的位置
class Solution {
public:
long long minimumSteps(string s) {
int s_size = s.size();
long long steps = 0;
int right = s_size - 1;
for (int i = s_size - 1; i >= 0; i--) {
if (s[i] == '1') {
steps += right - i;
right--;
}
}
return steps;
}
};
- 时间复杂度:$O(n)$,
n
是s
的长度 - 空间复杂度:$O(1)$
该方法参考了灵茶山艾府的题解。
该思路就是所有的0
都会因为0
左边的1
要移动而增加移动次数。而具体的移动次数是多少看该0
左边的1
有几个
class Solution:
def minimumSteps(self, s: str) -> int:
steps = count1 = 0
for c in s:
if c == '1':
count1 += 1
else:
steps += count1
return steps
- 时间复杂度:$O(n)$,
n
是s
的长度 - 空间复杂度:$O(1)$