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!
