1
+ class Solution {
2
+ /**
3
+ * First solution utilizes a hashmap and then does the due diligience of adding the
4
+ * appropriate values that appear more than n/3 times
5
+ * Runtime O(n) : Space O(n)
6
+ */
7
+ public List <Integer > majorityElement (int [] nums ) {
8
+ List <Integer > res = new ArrayList <>();
9
+ Map <Integer , Integer > map = new HashMap <>();
10
+ for (int i = 0 ; i < nums .length ; i ++) {
11
+ if (map .containsKey (nums [i ]))
12
+ map .put (nums [i ], map .get (nums [i ]) + 1 );
13
+ else
14
+ map .put (nums [i ], 1 );
15
+ }
16
+
17
+ for (Map .Entry <Integer , Integer > entry : map .entrySet ()) {
18
+ int potentialCandidate = entry .getValue ();
19
+ if (potentialCandidate > nums .length / 3 )
20
+ res .add (entry .getKey ());
21
+ }
22
+
23
+ return res ;
24
+ }
25
+
26
+
27
+ /**
28
+ * This is called Boyer-Moore Vote algorithm and the idea here is having candidates
29
+ * with diff values and two counters.
30
+ * For each number in the array we see if it equals the candidate and increment the count.
31
+ * The two numbers left after this process are the majority candidates.
32
+ * Loop through the array again then make sure that each candidate does indeed have more than n/3 occurrences
33
+ *
34
+ * Runtime O(n) : Space O(1)
35
+ */
36
+ public List <Integer > majorityElement_2 (int [] nums ) {
37
+ int candidate1 = 0 , candidate2 = 0 , count1 = 0 , count2 = 0 ;
38
+
39
+ for (int num : nums ) {
40
+ if (num == candidate1 ) count1 ++;
41
+ else if (num == candidate2 ) count2 ++;
42
+ else if (count1 == 0 ) {
43
+ candidate1 = num ;
44
+ count1 ++;
45
+ } else if (count2 == 0 ) {
46
+ candidate2 = num ;
47
+ count2 ++;
48
+ } else {
49
+ count1 --;
50
+ count2 --;
51
+ }
52
+ }
53
+
54
+ count1 = count2 = 0 ;
55
+ for (int num : nums ) {
56
+ if (num == candidate1 ) count1 ++;
57
+ else if (num == candidate2 ) count2 ++;
58
+ }
59
+
60
+ List <Integer > res = new ArrayList <>();
61
+ if (count1 > nums .length / 3 ) res .add (candidate1 );
62
+ if (count2 > nums .length / 3 ) res .add (candidate2 );
63
+ return res ;
64
+ }
65
+ }
0 commit comments