Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0ac8f44

Browse files
Merge pull request neetcode-gh#3042 from benmak11/229
Create 0229-majority-element-ii.java
2 parents 5d0d46a + af759ea commit 0ac8f44

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed

java/0229-majority-element-ii.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
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

Comments
 (0)