-
Notifications
You must be signed in to change notification settings - Fork 0
/
moore_voting_algo_majority_elem.rb
62 lines (54 loc) · 1.1 KB
/
moore_voting_algo_majority_elem.rb
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
58
59
60
61
62
# Find majority element(if exists) in a given array.
# A majority element in an array A[] of size n is an element that appears more than n/2 times
#Time-complexity: O(n), Auxiliary-space:O(1)
def majority_element(arr)
len = arr.length
maj_index = 0
count = 1
for i in 1...len
if arr[i] == arr[maj_index]
count += 1
else
count -= 1
end
if count == 0
maj_index += 1
count = 1
end
end
candidate = arr[maj_index]
count = 0
for i in 0...len
count += 1 if arr[i] == candidate
end
if count > (len / 2)
candidate
else
-1
end
end
arr = [1,2,1,2,1,2,3,5,6,2,1,8,4,7,1]
puts majority_element(arr)
def majority_elem_hash_approach(arr)
len = arr.length
h = tally_elem(arr)
maximum = h.values.max
if maximum > (len / 2)
h.collect { |k, v| k if maximum == v }.compact!
else
-1
end
end
def tally_elem(arr)
i = 0
j = 1
arr.sort!
val = arr.product([1]).to_h
while i < arr.length
val[arr[i]] += 1 if arr[i] == arr[j]
i += 1
j += 1
end
val
end
majority_elem_hash_approach([2, 1, 3, 2, 1, 1, 3, 2, 2, 2, 2])