3191: Minimum-Operations-to-Make-Binary-Array-Elements-Equal-to-One-I
Medium

You can just use a Greedy Approach for this question.

Basically, realise that for nums[0], the only way to flip it to 1, if it was originally equal to 0, is if you flip the bits present at nums[0], nums[1] and nums[2]. Then, for all operations going forward, we can basically ignore nums[0] since we know it is already set to 1 (and there is no reason to do 2 operations on the same index as the 2nd operation reverses the 1st operation).

We can continue this train-of-thought through the entire array, until we reach the last 2 elements. If these elements are both 1, then we have successfully made all elements in nums equal to 1, and can simply return a count of all the operations made. Otherwise, it means it is impossible to make all elements in nums equal to 1, and we can simply return -1.

Code:

class Solution {
public:
    int minOperations(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < nums.size()-2; ++i) {
            if (nums[i] == 1) continue;
            nums[i+1] ^= 1;
            nums[i+2] ^= 1;
            ++ans;
        }

        for (int i = nums.size()-2; i < nums.size(); ++i) {
            if (nums[i] == 0) return -1;
        }
        return ans;
    }
};

Complexity:

Time Taken: