majority number


Majority Element
Boyer–Moore majority vote algorithm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int (int[] nums) {
int count = 1;
int major = nums[0];
for (int i = 1; i < nums.length; ++i) {
if (count == 0) {
major = nums[i];
}
if (major == nums[i])
count++;
else
count--;
}
return major;
}

Majority Element II

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
public List<Integer> (int[] nums) {
List<Integer> ans = new ArrayList<Integer>();
if (nums == null || nums.length == 0)
return ans;
int count1 = 0, count2 = 0;
int major1 = 0, major2 = 0;
for (int i = 0; i < nums.length; ++i) {
if (count1 == 0) {
major1 = nums[i];
} else if (count2 == 0) {
major2 = nums[i];
}

if (major1 == nums[i]) {
count1++;
} else if (major2 == nums[i])
count2++;
else {
count1--;
count2--;
}
}
count1 = count2 = 0;
for (int i : nums) {
if (i == major1) {
count1++;
} else if (i == major2)
count2++;
}
if (count1 > nums.length / 3)
ans.add(major1);

if (count2 > nums.length / 3)
ans.add(major2);

return ans;
}

改一改,我觉得这个版本好些。

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
public List<Integer> (int[] nums) {
List<Integer> ans = new ArrayList<Integer>();
if (nums == null || nums.length == 0)
return ans;
int n1 = 0, n2 = 0, c1 = 0, c2 = 0;
for (int i : nums) {
if (n1 == i)
++c1;
else if (n2 == i)
++c2;
else if (c1 == 0) {
c1 = 1; n1 = i;
} else if (c2 == 0) {
c2 = 1; n2 = i;
} else {
--c1; --c2;
}
}
c1 = 0; c2 = 0;
for (int i : nums) {
if (i == n1)
++c1;
else if (i == n2)
++c2;
}
if (c1 > nums.length / 3)
ans.add(n1);
if (c2 > nums.length / 3)
ans.add(n2);
return ans;
}

Majority Element III
注意,哈希表不能一边遍历一边删除。

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
public int majorityNumber(ArrayList<Integer> nums, int k) {

HashMap<Integer, Integer> map = new HashMap<>();
for (int i : nums) {
if (map.containsKey(i)) {
map.put(i, map.get(i) + 1);
} else
map.put(i, 1);

if (map.size() >= k)
remove(map);
}
for (int i : map.keySet()) {
map.put(i, 0);
}
for (int i : nums) {
if (map.containsKey(i))
map.put(i, map.get(i) + 1);
}
int max = 0, ans = 0;
for (int i : map.keySet()) {
if (max < map.get(i)) {
ans = i;
max = map.get(i);
}
}
return ans;
}

public void remove(HashMap<Integer, Integer> map) {
Set<Integer> set = map.keySet();
HashSet<Integer> delete = new HashSet<>();
for (int i : set) {
map.put(i, map.get(i) - 1);
if (map.get(i) == 0)
delete.add(i);
}
for (int i : delete) {
map.remove(i);
}
}