在C ++中翻转为零
假设我们有一个称为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)
(增加ret1)
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