Minimum Operations to Make Binary Array Elements Equal to One II

Med
#2835Time: O(N^2), where N is the length of `nums`. The outer loop runs N times. In the worst case (e.g., an array of all zeros), the inner loop for flipping also runs up to N times for each outer loop iteration, resulting in a quadratic runtime.Space: O(1), as we modify the input array in-place. If modifying the input is not allowed, the space complexity would be O(N) to maintain a copy of the array.
Data structures

Prompt

You are given a binary array nums.

You can do the following operation on the array any number of times (possibly zero):

  • Choose any index i from the array and flip all the elements from index i to the end of the array.

Flipping an element means changing its value from 0 to 1, and from 1 to 0.

Return the minimum number of operations required to make all elements in nums equal to 1.

 

Example 1:

Input: nums = [0,1,1,0,1]

Output: 4

Explanation:
We can do the following operations:

  • Choose the index i = 1. The resulting array will be nums = [0,0,0,1,0].
  • Choose the index i = 0. The resulting array will be nums = [1,1,1,0,1].
  • Choose the index i = 4. The resulting array will be nums = [1,1,1,0,0].
  • Choose the index i = 3. The resulting array will be nums = [1,1,1,1,1].

Example 2:

Input: nums = [1,0,0,0]

Output: 1

Explanation:
We can do the following operation:

  • Choose the index i = 1. The resulting array will be nums = [1,1,1,1].

 

Constraints:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 1

Approaches

2 approaches with complexity analysis and trade-offs.

This approach directly simulates the process described in the problem. We iterate through the array from left to right. Whenever we encounter a 0, we perform a flip operation starting from that index to make it a 1. This is a greedy strategy because we fix each element from left to right, and a flip at index i does not affect elements before it.

Algorithm

  • Initialize a variable operations to 0.
  • Iterate through the array nums from index i = 0 to n-1.
  • At each index i, if nums[i] is 0, it means we must perform a flip operation to make it 1.
  • Increment operations.
  • To simulate the flip, start another loop from j = i to n-1 and change nums[j] to 1 - nums[j].
  • If nums[i] is already 1, do nothing and continue to the next element.
  • After the loop finishes, return operations.

Walkthrough

The core idea is to iterate through the array and fix each element one by one. When we are at index i, we want to ensure nums[i] becomes 1. If it's already 1, we move on. If it's 0, the only way to change it without altering the already-fixed elements nums[0...i-1] is to perform an operation starting at index i. This operation flips all elements from nums[i] to the end of the array. We count this as one operation and perform the actual flip on the array. We repeat this process for all elements.

class Solution {    public int minOperations(int[] nums) {        int operations = 0;        int n = nums.length;        for (int i = 0; i < n; i++) {            // If the current element is 0, we need to flip it.            if (nums[i] == 0) {                operations++;                // Simulate the flip for all elements from i to the end.                for (int j = i; j < n; j++) {                    nums[j] = 1 - nums[j];                }            }        }        return operations;    }}

Complexity

Time

O(N^2), where N is the length of `nums`. The outer loop runs N times. In the worst case (e.g., an array of all zeros), the inner loop for flipping also runs up to N times for each outer loop iteration, resulting in a quadratic runtime.

Space

O(1), as we modify the input array in-place. If modifying the input is not allowed, the space complexity would be O(N) to maintain a copy of the array.

Trade-offs

Pros

  • The logic is straightforward and directly follows the problem statement, making it easy to understand and implement.

  • It correctly solves the problem by making locally optimal choices that lead to a global optimum.

Cons

  • The time complexity of O(N^2) makes it too slow for large inputs, likely causing a 'Time Limit Exceeded' error on competitive programming platforms.

Solutions

class Solution {public  int minOperations(int[] nums) {    int ans = 0, v = 0;    for (int x : nums) {      x ^= v;      if (x == 0) {        v ^= 1;        ++ans;      }    }    return ans;  }}

Video walkthrough

Newsletter

One sharp idea, every week

System design and interview prep — short enough to finish.

No spam. Unsubscribe anytime.

Practice

Same difficulty — related problems to reinforce the pattern.