Given a circular array containing only 0’s and 1’s, of size n where n = p*q (p and q are both odd integers). The task is to check if there is a way such that 1 will be in majority after applying the following operations:
- Divide circular array into p subarrays each of size q.
 - In each subarray, the number which is in majority will get stored into array B.
 - Now, 1 will said to be in majority if it is in majority into array B.
 
Note: A number is in majority in an array if it occurs more than half times of the size of an array.
Examples:
Input: p = 3, q = 3, array[] = {0, 0, 1, 1, 0, 1, 1, 0, 0}
Output: Yes
Assume index of the array from 1 to N, Since the array is circular so index N and 1 will be adjacent.
Divide this circular array into subarray in this way :-
{2, 3, 4}, {5, 6, 7} and {8, 9, 1}. [These are the index of elements]
In {2, 3, 4}, 1 is in majority,
in {5, 6, 7}, again 1 is in majority and
In {8, 9, 1}, 0 is in majority.
Now insert 1, 1, 0 into array B so array B = {1, 1, 0}
In array B, 1 is the majority element so print Yes.Input: p = 3, q = 3, array[] = {1, 0, 0, 1, 1, 0, 1, 0, 0}
Output: No
No matter how you divide this circular subarray,
1 will not be in majority. Hence, the answer is No.
Approach:
- First of all, iterate over the circular array and count the total number of 1’s in each of p subarray(of size q).
 - Store this number into another array (of size p).
 - If in this case, 1 is in majority then, print yes.
 - Else take another set by moving the previous set’s index 1 unit either increasing or decreasing it, and keep track of only those indices which are new in given set and update number of 1’s in the array.
 - Repeat the 2nd and 3rd step.
 
We will repeat q times if there is no majority of 1 found until that, the answer would be NO, else ( like in the previous example case ) the answer would be 1. 
Since at the maximum, we can repeat this process q times and each time we are tracking only two elements in each of p subarray.
Explanation:
In given example-1, we will divide circular subarray as [indices] => {1, 2, 3}, {4, 5, 6}, {7, 8, 9} and store number of 1’s in another array which are [1, 2, 1] in subarrays respectively.
Taking another set in example 1 by increasing 1 unit so set will be {2, 3, 4}, {5, 6, 7}, {8, 9, 1} now in set 1 only change is inclusion of element 4 and removal of element 1, we will only track these so updated number of 1’s will be 2, 2, 0.
Below is the implementation of above approach:
C++
// C++ implementation of above approach#include <bits/stdc++.h>using namespace std;// Function to check if 1 is the majority// element or notvoid majority(bool a[], int p, int q, int size){    // assuming starting and ending index of 1st subarray    int start = 0, ends = q;    // to store majority of p    int arr[p];    // subarrays each of size q ;    int k = 0;    // Loop to calculate total number    // of 1's in subarray which will get    // stored in array arr[]    while (k < p) {        int one = 0;        for (int j = start; j < ends; j++) {            if (a[j] == 1) {                one++;            }        }        // starting index of next subarray        start = ends;        // ending index of next subarray        ends = ends + q;        // storing 1's        arr[k] = one;        k++;    }    start = 0;    ends = q;    // variable to keep a check    // if 1 is in majority or not    bool found = 0;    // In this case, we are repeating    // the task of calculating    // total number of 1's backward    while (ends > 0) {        // to store the total number of 1's        int dist_one = 0;        // Check if 1 is in majority in        // this subarray        for (int i = 0; i < p; i++)            if (arr[i] > q / 2)                dist_one++;        // If 1 is in majority return        if (dist_one > p / 2) {            found = 1;            cout << "Yes" << endl;            return;        }        // shifting starting index of        // subarray by 1 unit leftwards        start--;        // shifting ending index of        // subarray by 1 unit leftwards        ends--;        // to ensure it is a valid index        // ( array is circular) -1 index means        // last index of a circular array        if (start < 0)            start = size + start;        int st = start, en = ends, l = 0;        // now to track changes occur        // due to shifting of the subarray        while (en < size) {            if (a[st % size] != a[en % size]) {                // st refers to starting index of                // new subarray and en refers to                // last element of same subarray                // but in previous iteration                if (a[st % size] == 1)                    arr[l]++;                else                    arr[l]--;            }            l++;            // now repeating the same            // for other subarrays too            st = (st + q);            en = en + q;        }    }    if (found == 0) {        cout << "No" << endl;    }}// Driver codeint main(){    int p = 3, q = 3;    int n = p * q;    bool a[] = { 0, 0, 1, 1, 0, 1, 1, 0, 0 };    // circular array of given size    majority(a, p, q, n);    return 0;} | 
Java
// Java implementation of above approachimport java.util.*;import java.lang.*;import java.io.*;class GFG{// Function to check if 1 is the majority// element or notstatic void majority(int a[], int p, int q, int size){    // assuming starting and ending index of 1st subarray    int start = 0, ends = q;      // to store majority of p    int []arr = new int[p];      // subarrays each of size q ;    int k = 0;      // Loop to calculate total number    // of 1's in subarray which will get    // stored in array arr[]    while (k < p) {        int one = 0;        for (int j = start; j < ends; j++) {            if (a[j] == 1) {                one++;            }        }          // starting index of next subarray        start = ends;          // ending index of next subarray        ends = ends + q;          // storing 1's        arr[k] = one;        k++;    }      start = 0;    ends = q;      // variable to keep a check    // if 1 is in majority or not    boolean  found = false;      // In this case, we are repeating    // the task of calculating    // total number of 1's backward    while (ends > 0) {          // to store the total number of 1's        int dist_one = 0;          // Check if 1 is in majority in        // this subarray        for (int i = 0; i < p; i++)            if (arr[i] > q / 2)                dist_one++;          // If 1 is in majority return        if (dist_one > p / 2) {            found = true;            System.out.println( "Yes" );              return;        }          // shifting starting index of        // subarray by 1 unit leftwards        start--;          // shifting ending index of        // subarray by 1 unit leftwards        ends--;          // to ensure it is a valid index        // ( array is circular) -1 index means        // last index of a circular array        if (start < 0)            start = size + start;          int st = start, en = ends,l = 0;          // now to track changes occur        // due to shifting of the subarray        while (en < size) {              if (a[st % size] != a[en % size]) {                  // st refers to starting index of                // new subarray and en refers to                // last element of same subarray                // but in previous iteration                if (a[st % size] == 1)                    arr[l]++;                  else                    arr[l]--;            }            l++;              // now repeating the same            // for other subarrays too            st = (st + q);            en = en + q;        }    }      if (found == false ) {        System.out.println( "No" );    }}  // Driver codepublic static void main(String args[]){    int p = 3, q = 3;    int n = p * q;      int a[] = { 0, 0, 1, 1, 0, 1, 1, 0, 0 };      // circular array of given size    majority(a, p, q, n);       }} | 
Python3
# Python3 implementation of# above approach # Function to check if 1 is # the majority element or not def majority(a, p, q, size) :    # assuming starting and     # ending index of 1st subarray     start = 0    ends = q     # to store arr = []    arr = [None] * p         # subarrays each of size q     k = 0         # Loop to calculate total number     # of 1's in subarray which     # will get stored in array arr    while (k < p):         one = 0        for j in range(start, ends):             if (a[j] == 1):                 one = one + 1                     # starting index of         # next subarray         start = ends         # ending index of next        # subarray         ends = ends + q         # storing 1's         arr[k] = one        k = k + 1         start = 0    ends = q     # variable to keep a check     # if 1 is in majority or not     found = 0    # In this case, we are     # repeating the task of     # calculating total number    # of 1's backward     while (ends > 0) :         # to store the total         # number of 1's         dist_one = 0          # Check if 1 is in majority         # in this subarray         for i in range(0, p):            if (arr[i] > q / 2):                 dist_one = dist_one + 1        # If 1 is in majority return         if (dist_one > p / 2) :            found = 1            print("Yes")             return        # shifting starting index of         # subarray by 1 unit leftwards         start = start - 1        # shifting ending index         # of subarray by 1 unit         # leftwards         ends = ends - 1        # to ensure it is a valid         # index( array is circular) -1        # index means last index of        # a circular array         if (start < 0):            start = size + start        st = start        en = ends        l = 0        # now to track changes occur         # due to shifting of the         # subarray         while (en < size) :            if (a[st % size] != a[en % size]) :                # st refers to starting index of                 # new subarray and en refers to                 # last element of same subarray                 # but in previous iteration                 if (a[st % size] == 1):                    arr[l] = arr[l] + 1                else:                    arr[l] = arr[l] - 1                         l = l + 1            # now repeating the same             # for other subarrays too             st = (st + q)             en = en + q              if (found == 0) :         print("No")      # Driver code p = 3q = 3n = p * qa = [ 0, 0, 1, 1, 0, 1, 1, 0, 0 ] # circular array of given size majority(a, p, q, n)# This code is contributed# by Yatin Gupta | 
C#
// C# implementation of above approach using System;class GFG{// Function to check if 1 is the // majority element or not public static void majority(int[] a, int p,                             int q, int size){    // assuming starting and ending    // index of 1st subarray     int start = 0, ends = q;    // to store majority of p     int[] arr = new int[p];    // subarrays each of size q ;     int k = 0;    // Loop to calculate total number     // of 1's in subarray which will     // get stored in array arr[]     while (k < p)    {        int one = 0;        for (int j = start; j < ends; j++)        {            if (a[j] == 1)            {                one++;            }        }        // starting index of next subarray         start = ends;        // ending index of next subarray         ends = ends + q;        // storing 1's         arr[k] = one;        k++;    }    start = 0;    ends = q;    // variable to keep a check     // if 1 is in majority or not     bool found = false;    // In this case, we are repeating     // the task of calculating     // total number of 1's backward     while (ends > 0)    {        // to store the total number of 1's         int dist_one = 0;        // Check if 1 is in majority in         // this subarray         for (int i = 0; i < p; i++)        {            if (arr[i] > q / 2)            {                dist_one++;            }        }        // If 1 is in majority return         if (dist_one > p / 2)        {            found = true;            Console.WriteLine("Yes");            return;        }        // shifting starting index of         // subarray by 1 unit leftwards         start--;        // shifting ending index of         // subarray by 1 unit leftwards         ends--;        // to ensure it is a valid index         // ( array is circular) -1 index means         // last index of a circular array         if (start < 0)        {            start = size + start;        }        int st = start, en = ends, l = 0;        // now to track changes occur         // due to shifting of the subarray         while (en < size)        {            if (a[st % size] != a[en % size])            {                // st refers to starting index of                 // new subarray and en refers to                 // last element of same subarray                 // but in previous iteration                 if (a[st % size] == 1)                {                    arr[l]++;                }                else                {                    arr[l]--;                }            }            l++;            // now repeating the same             // for other subarrays too             st = (st + q);            en = en + q;        }    }    if (found == false)    {        Console.WriteLine("No");    }}// Driver code public static void Main(string[] args){    int p = 3, q = 3;    int n = p * q;    int[] a = new int[] {0, 0, 1, 1,                          0, 1, 1, 0, 0};    // circular array of given size     majority(a, p, q, n);}}// This code is contributed by Shrikant13 | 
PHP
<?php//PHP  implementation of above approach // Function to check if 1 is the majority // element or not function  majority($a, $p, $q, $size) {     // assuming starting and ending index of 1st subarray      $start = 0; $ends = $q;     // to store majority of p     $arr=array(0);     // subarrays each of size q ;     $k = 0;     // Loop to calculate total number     // of 1's in subarray which will get     // stored in array arr[]     while ($k < $p) {         $one = 0;         for ($j = $start; $j < $ends; $j++) {             if ($a[$j] == 1) {                 $one++;             }         }         // starting index of next subarray         $start = $ends;         // ending index of next subarray         $ends = $ends + $q;         // storing 1's         $arr[$k] = $one;         $k++;     }     $start = 0;     $ends = $q;     // variable to keep a check     // if 1 is in majority or not      $found = 0;     // In this case, we are repeating     // the task of calculating     // total number of 1's backward     while ($ends > 0) {         // to store the total number of 1's         $dist_one = 0;         // Check if 1 is in majority in         // this subarray         for ($i = 0; $i < $p; $i++)             if ($arr[$i] > $q / 2)                 $dist_one++;         // If 1 is in majority return         if ($dist_one > $p / 2) {             $found = 1;             echo  "Yes" ,"\n";             return;         }         // shifting starting index of         // subarray by 1 unit leftwards         $start--;         // shifting ending index of         // subarray by 1 unit leftwards         $ends--;         // to ensure it is a valid index         // ( array is circular) -1 index means         // last index of a circular array         if ($start < 0)             $start = $size + $start;          $st = $start; $en = $ends; $l = 0;         // now to track changes occur         // due to shifting of the subarray         while ($en < $size) {             if ($a[$st % $size] != $a[$en % $size]) {                 // st refers to starting index of                 // new subarray and en refers to                 // last element of same subarray                 // but in previous iteration                 if ($a[$st % $size] == 1)                     $arr[$l]++;                 else                    $arr[$l]--;             }             $l++;             // now repeating the same             // for other subarrays too             $st = ($st + $q);             $en = $en + $q;         }     }     if ($found == 0) {         echo  "No" ,"\n";     } } // Driver code     $p = 3; $q = 3;     $n = $p * $q;      $a = array( 0, 0, 1, 1, 0, 1, 1, 0, 0 );     // circular array of given size     majority($a, $p, $q, $n); #This Code is Contributed by ajit?> | 
Javascript
<script>    // Javascript implementation     // of above approach         // Function to check if 1 is the     // majority element or not     function majority(a, p, q, size)    {        // assuming starting and ending        // index of 1st subarray         let start = 0, ends = q;        // to store majority of p         let arr = new Array(p);        arr.fill(0);        // subarrays each of size q ;         let k = 0;        // Loop to calculate total number         // of 1's in subarray which will         // get stored in array arr[]         while (k < p)        {            let one = 0;            for (let j = start; j < ends; j++)            {                if (a[j] == 1)                {                    one++;                }            }            // starting index of next subarray             start = ends;            // ending index of next subarray             ends = ends + q;            // storing 1's             arr[k] = one;            k++;        }        start = 0;        ends = q;        // variable to keep a check         // if 1 is in majority or not         let found = false;        // In this case, we are repeating         // the task of calculating         // total number of 1's backward         while (ends > 0)        {            // to store the total number of 1's             let dist_one = 0;            // Check if 1 is in majority in             // this subarray             for (let i = 0; i < p; i++)            {                if (arr[i] > parseInt(q / 2, 10))                {                    dist_one++;                }            }            // If 1 is in majority return             if (dist_one > parseInt(p / 2, 10))            {                found = true;                document.write("Yes");                return;            }            // shifting starting index of             // subarray by 1 unit leftwards             start--;            // shifting ending index of             // subarray by 1 unit leftwards             ends--;            // to ensure it is a valid index             // ( array is circular) -1 index means             // last index of a circular array             if (start < 0)            {                start = size + start;            }            let st = start, en = ends, l = 0;            // now to track changes occur             // due to shifting of the subarray             while (en < size)            {                if (a[st % size] != a[en % size])                {                    // st refers to starting index of                     // new subarray and en refers to                     // last element of same subarray                     // but in previous iteration                     if (a[st % size] == 1)                    {                        arr[l]++;                    }                    else                    {                        arr[l]--;                    }                }                l++;                // now repeating the same                 // for other subarrays too                 st = (st + q);                en = en + q;            }        }        if (found == false)        {            document.write("No");        }    }         let p = 3, q = 3;    let n = p * q;       let a = [0, 0, 1, 1, 0, 1, 1, 0, 0];       // circular array of given size     majority(a, p, q, n);     </script> | 
Yes
Complexity Analysis:
- Time Complexity: O(p*q)
 - Auxiliary Space: O(1)
 
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
