假设我们有一个称为nums的整数数组,其中包含0和1。假设我们有一个操作,我们选择以数字为单位的索引i,并在索引i处翻转元素以及i右边的所有数字。我们必须找到使num包含全0所需的最少操作数。
因此,如果输入类似于[1,0,1],则输出将为3,对索引0进行运算,它将转换为[0,1,0],然后对索引1 [0,0,1]进行运算,然后是索引2 [0,0,0]。
为了解决这个问题,我们将遵循以下步骤-
n:= nums的大小
定义大小为n的数组op
ret:= 0
对于初始化i:= 0,当i <nums大小时,更新(将i增加1),执行-
(将op [i]增加1)
(增加ret 1)
op [i]:= op [i] + op [i-1]
如果i-1> = 0,则-
如果(nums [i] + op [i])&1不为零,则-
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int solve(vector<int>& nums) { int n = nums.size(); vector<int> op(n); int ret = 0; for (int i = 0; i < nums.size(); i++) { if (i - 1 >= 0) { op[i] += op[i - 1]; } if ((nums[i] + op[i]) & 1) { op[i]++; ret++; } } return ret; } }; main() { Solution ob; vector<int> v = {1,0,1}; cout << (ob.solve(v)); }
{1,0,1}
输出结果
3