Description#
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 API ArrayReader
which have the following functions:
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#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| # """
# 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:
#
class Solution:
def guessMajority(self, reader: "ArrayReader") -> int:
n = reader.length()
x = reader.query(0, 1, 2, 3)
a, b = 1, 0
k = 0
for i in range(4, n):
if reader.query(0, 1, 2, i) == x:
a += 1
else:
b += 1
k = i
y = reader.query(0, 1, 2, 4)
if reader.query(1, 2, 3, 4) == y:
a += 1
else:
b += 1
k = 0
if reader.query(0, 2, 3, 4) == y:
a += 1
else:
b += 1
k = 1
if reader.query(0, 1, 3, 4) == y:
a += 1
else:
b += 1
k = 2
if a == b:
return -1
return 3 if a > b else k
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| /**
* // 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();
* };
*/
class Solution {
public int guessMajority(ArrayReader reader) {
int n = reader.length();
int x = reader.query(0, 1, 2, 3);
int a = 1, b = 0;
int k = 0;
for (int i = 4; i < n; ++i) {
if (reader.query(0, 1, 2, i) == x) {
++a;
} else {
++b;
k = i;
}
}
int y = 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;
}
return a > b ? 3 : k;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
| /**
* // 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();
* };
*/
class Solution {
public:
int guessMajority(ArrayReader& reader) {
int n = reader.length();
int x = reader.query(0, 1, 2, 3);
int a = 1, b = 0;
int k = 0;
for (int i = 4; i < n; ++i) {
if (reader.query(0, 1, 2, i) == x) {
++a;
} else {
++b;
k = i;
}
}
int y = 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;
}
return a > b ? 3 : k;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| /**
* // 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 {}
*/
func guessMajority(reader *ArrayReader) int {
n := reader.length()
x := reader.query(0, 1, 2, 3)
a, b := 1, 0
k := 0
for i := 4; i < n; i++ {
if reader.query(0, 1, 2, i) == x {
a++
} else {
b++
k = i
}
}
y := 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
}
if a > b {
return 3
}
return k
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| /**
* // 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 { };
* };
*/
function guessMajority(reader: ArrayReader): number {
const n = reader.length();
const x = reader.query(0, 1, 2, 3);
let a = 1;
let b = 0;
let k = 0;
for (let i = 4; i < n; ++i) {
if (reader.query(0, 1, 2, i) === x) {
++a;
} else {
++b;
k = i;
}
}
const y = 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;
}
return a > b ? 3 : k;
}
|