在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)

    • (增加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