forked from alqamahjsr/Algorithms
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path169_Majority_Element.py
More file actions
40 lines (28 loc) · 1.45 KB
/
169_Majority_Element.py
File metadata and controls
40 lines (28 loc) · 1.45 KB
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
class Solution(object):
# Bit manipulation
# The algorithm first determines the frequency of each bit in the input array.
# If there is a number with a majority in the input (i.e. it makes up more than half of the input),
# then the frequency of all its set bits will be in the majority, and the frequency of all its unset bits will be in the minority.
#
# The majority number can be recreated from the frequency table by masking together all the majority bits.
# This relies on there being a majority. If there is not guaranteed to be a majority a second pass to check the result is required.
def majorityElement(self, nums):
bitFrequencyTable = [0] * 32 # Bit frequency table
# Work out bit frequency
for num in nums:
for j in range(32): # for each bit
if (num >> j & 1) != 0: # is bit j set?
bitFrequencyTable[j] += 1 # increment frequency
# Recreate the majority number
res = 0
for i, val in enumerate(bitFrequencyTable): # for each bit
if val > len(nums) // 2: # is bit i in the majority?
if i == 31: # if the 31th bit if 1, it means it's a negative number
res = -((1 << 31) - res)
else:
res |= 1 << i # mask bit i into the result
return res
sol = Solution()
input = [-2,-2,1,1,1,-2,-2]
output = sol.majorityElement(input)
print('Res: ', output)