Every day a Leetcode
题目来源:2938. 区分黑球与白球
解法1:贪心
把 ‘0’ 挪到相应的位置。
类似于冒泡排序的思想,把 ‘0’ 挪到相应的位置。
示例:
代码:
/*
* @lc app=leetcode.cn id=2938 lang=cpp
*
* [2938] 区分黑球与白球
*/
// @lc code=start
class Solution
{
public:
long long minimumSteps(string s)
{
int white = 0;
long long steps = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '0')
{
steps += (long long)(i - white);
white++;
}
}
return steps;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(1)。
解法2:贪心
操作次数 = Σ(每个 ‘0’ 左边的 ‘1’ 的个数)。
代码:
/*
* @lc app=leetcode.cn id=2938 lang=cpp
*
* [2938] 区分黑球与白球
*/
// @lc code=start
// class Solution
// {
// public:
// long long minimumSteps(string s)
// {
// int white = 0;
// long long steps = 0;
// for (int i = 0; i < s.length(); i++)
// {
// if (s[i] == '0')
// {
// steps += (long long)(i - white);
// white++;
// }
// }
// return steps;
// }
// };
class Solution
{
public:
long long minimumSteps(string s)
{
int black = 0;
long long steps = 0;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '0')
steps += black;
else
black++;
}
return steps;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(1)。