We have an integer array nums, where all the integers in nums are 0 or 1. You will not be given direct access to the array, instead, you will have an APIArrayReader which have the following functions:
int query(int a, int b, int c, int d): where 0 <= a < b < c < d < ArrayReader.length(). The function returns the distribution of the value of the 4 elements and returns:
4 : if the values of the 4 elements are the same (0 or 1).
2 : if three elements have a value equal to 0 and one element has value equal to 1 or vice versa.
0 : if two element have a value equal to 0 and two elements have a value equal to 1.
int length(): Returns the size of the array.
You are allowed to call query()2 * n times at most where n is equal to ArrayReader.length().
Return any index of the most frequent value in nums, in case of tie, return -1.
Example 1:
Input: nums = [0,0,1,0,1,1,1,1]
Output: 5
Explanation: The following calls to the API
reader.length() // returns 8 because there are 8 elements in the hidden array.
reader.query(0,1,2,3) // returns 2 this is a query that compares the elements nums[0], nums[1], nums[2], nums[3]
// Three elements have a value equal to 0 and one element has value equal to 1 or viceversa.
reader.query(4,5,6,7) // returns 4 because nums[4], nums[5], nums[6], nums[7] have the same value.
we can infer that the most frequent value is found in the last 4 elements.
Index 2, 4, 6, 7 is also a correct answer.
Example 2:
Input: nums = [0,0,1,1,0]
Output: 0
Example 3:
Input: nums = [1,0,1,0,1,0,1,0]
Output: -1
Constraints:
5 <= nums.length <= 105
0 <= nums[i] <= 1
Follow up: What is the minimum number of calls needed to find the majority element?
Solutions
Solution 1: Brainteaser
We first call reader.query(0, 1, 2, 3) and record the result as \(x\).
Next, we iterate from index \(4\) onwards. Each time we call reader.query(0, 1, 2, i), if the result is the same as \(x\), we increment \(a\) by one; otherwise, we increment \(b\) by one and update \(k\) to \(i\).
Then, we need to check whether the elements at indices \(0, 1, 2\) are the same as the element at index \(3\). If they are the same, we increment \(a\) by one; otherwise, we increment \(b\) by one and update \(k\) to the corresponding index.
Finally, if \(a = b\), it means the number of \(0\)s and \(1\)s in the array are equal, so we return \(-1\); otherwise, if \(a > b\), we return \(3\), otherwise we return \(k\).
The time complexity is \(O(n)\), where \(n\) is the length of the array. The space complexity is \(O(1)\).
# """# This is the ArrayReader's API interface.# You should not implement it, or speculate about its implementation# """# class ArrayReader(object):# # Compares 4 different elements in the array# # return 4 if the values of the 4 elements are the same (0 or 1).# # return 2 if three elements have a value equal to 0 and one element has value equal to 1 or vice versa.# # return 0 : if two element have a value equal to 0 and two elements have a value equal to 1.# def query(self, a: int, b: int, c: int, d: int) -> int:## # Returns the length of the array# def length(self) -> int:#classSolution:defguessMajority(self,reader:"ArrayReader")->int:n=reader.length()x=reader.query(0,1,2,3)a,b=1,0k=0foriinrange(4,n):ifreader.query(0,1,2,i)==x:a+=1else:b+=1k=iy=reader.query(0,1,2,4)ifreader.query(1,2,3,4)==y:a+=1else:b+=1k=0ifreader.query(0,2,3,4)==y:a+=1else:b+=1k=1ifreader.query(0,1,3,4)==y:a+=1else:b+=1k=2ifa==b:return-1return3ifa>belsek
/** * // This is the ArrayReader's API interface. * // You should not implement it, or speculate about its implementation * interface ArrayReader { * public: * // Compares 4 different elements in the array * // return 4 if the values of the 4 elements are the same (0 or 1). * // return 2 if three elements have a value equal to 0 and one element has value equal to 1 or * vice versa. * // return 0 : if two element have a value equal to 0 and two elements have a value equal * to 1. public int query(int a, int b, int c, int d); * * // Returns the length of the array * public int length(); * }; */classSolution{publicintguessMajority(ArrayReaderreader){intn=reader.length();intx=reader.query(0,1,2,3);inta=1,b=0;intk=0;for(inti=4;i<n;++i){if(reader.query(0,1,2,i)==x){++a;}else{++b;k=i;}}inty=reader.query(0,1,2,4);if(reader.query(1,2,3,4)==y){++a;}else{++b;k=0;}if(reader.query(0,2,3,4)==y){++a;}else{++b;k=1;}if(reader.query(0,1,3,4)==y){++a;}else{++b;k=2;}if(a==b){return-1;}returna>b?3:k;}}
/** * // This is the ArrayReader's API interface. * // You should not implement it, or speculate about its implementation * class ArrayReader { * public: * // Compares 4 different elements in the array * // return 4 if the values of the 4 elements are the same (0 or 1). * // return 2 if three elements have a value equal to 0 and one element has value equal to 1 or vice versa. * // return 0 : if two element have a value equal to 0 and two elements have a value equal to 1. * int query(int a, int b, int c, int d); * * // Returns the length of the array * int length(); * }; */classSolution{public:intguessMajority(ArrayReader&reader){intn=reader.length();intx=reader.query(0,1,2,3);inta=1,b=0;intk=0;for(inti=4;i<n;++i){if(reader.query(0,1,2,i)==x){++a;}else{++b;k=i;}}inty=reader.query(0,1,2,4);if(reader.query(1,2,3,4)==y){++a;}else{++b;k=0;}if(reader.query(0,2,3,4)==y){++a;}else{++b;k=1;}if(reader.query(0,1,3,4)==y){++a;}else{++b;k=2;}if(a==b){return-1;}returna>b?3:k;}};
/** * // This is the ArrayReader's API interface. * // You should not implement it, or speculate about its implementation * type ArrayReader struct { * } * // Compares 4 different elements in the array * // return 4 if the values of the 4 elements are the same (0 or 1). * // return 2 if three elements have a value equal to 0 and one element has value equal to 1 or vice versa. * // return 0 : if two element have a value equal to 0 and two elements have a value equal to 1. * func (this *ArrayReader) query(a, b, c, d int) int {} * * // Returns the length of the array * func (this *ArrayReader) length() int {} */funcguessMajority(reader*ArrayReader)int{n:=reader.length()x:=reader.query(0,1,2,3)a,b:=1,0k:=0fori:=4;i<n;i++{ifreader.query(0,1,2,i)==x{a++}else{b++k=i}}y:=reader.query(0,1,2,4)ifreader.query(1,2,3,4)==y{a++}else{b++k=0}ifreader.query(0,2,3,4)==y{a++}else{b++k=1}ifreader.query(0,1,3,4)==y{a++}else{b++k=2}ifa==b{return-1}ifa>b{return3}returnk}
/** * // This is the ArrayReader's API interface. * // You should not implement it, or speculate about its implementation * class ArrayReader { * // Compares 4 different elements in the array * // return 4 if the values of the 4 elements are the same (0 or 1). * // return 2 if three elements have a value equal to 0 and one element has value equal to 1 or vice versa. * // return 0 : if two element have a value equal to 0 and two elements have a value equal to 1. * query(a: number, b: number, c: number, d: number): number { }; * * // Returns the length of the array * length(): number { }; * }; */functionguessMajority(reader:ArrayReader):number{constn=reader.length();constx=reader.query(0,1,2,3);leta=1;letb=0;letk=0;for(leti=4;i<n;++i){if(reader.query(0,1,2,i)===x){++a;}else{++b;k=i;}}consty=reader.query(0,1,2,4);if(reader.query(1,2,3,4)===y){++a;}else{++b;k=0;}if(reader.query(0,2,3,4)===y){++a;}else{++b;k=1;}if(reader.query(0,1,3,4)===y){++a;}else{++b;k=2;}if(a===b){return-1;}returna>b?3:k;}