Every day a Leetcode
题目来源:3192. 使二进制数组全部等于 1 的最少操作次数 II
解法1:遍历
由于 nums[i] 会被其左侧元素的操作影响,所以我们先从最左边的 nums[0] 开始思考。
分类讨论:
- 如果 nums[0]=1,无需反转,问题变成剩下 n−1 个数如何操作。接下来考虑 nums[1]。
- 如果 nums[0]=0,反转次数加一,问题变成剩下 n−1 个数(在修改次数是奇数的情况下)如何操作。接下来考虑 nums[1]。
对后续元素来说,由于反转偶数次等于没反转,所以只需考虑反转次数的奇偶性。
一般地,设反转次数的奇偶性为 k,分类讨论:
- 如果 nums[i]≠k,无需反转,接下来考虑 nums[i+1]。
- 如果 nums[i]=k,反转次数加一,接下来考虑 nums[i+1]。
代码:
/*
* @lc app=leetcode.cn id=3192 lang=cpp
*
* [3192] 使二进制数组全部等于 1 的最少操作次数 II
*/
// @lc code=start
class Solution
{
public:
int minOperations(vector<int> &nums)
{
int n = nums.size();
int ans = 0;
for (int i = 0; i < n; i++)
{
if (nums[i] == 1 && ans % 2 == 1)
ans++;
if (nums[i] == 0 && ans % 2 == 0)
ans++;
}
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。