给定一个大小为n的整数数组,找出其中所有超过n/3次的元素,可能有两个,可能有一个,可能没有。
一半我会求可以用异或,三分之一怎么办?
给定一个大小为n的整数数组,找出其中所有超过n/3次的元素,可能有两个,可能有一个,可能没有。
一半我会求可以用异或,三分之一怎么办?
摩尔投票法
public class Solution229 {
/**
* 摩尔投票法,一次遍历,时间 O(n),空间O(1)
*/
public List<Integer> majorityElement(int[] nums) {
int v1 = 0, v2 = 0;
int t1 = 0, t2 = 0;
for (int v : nums) {
if (v == v1) {
t1++;
} else if (v == v2) {
t2++;
} else if (t1 == 0) {
v1 = v;
t1 = 1;
} else if (t2 == 0) {
v2 = v;
t2 = 1;
} else {
t1--;
t2--;
}
}
t1 = t2 = 0;
for (int v : nums) {
if (v == v1) {
t1++;
} else if (v == v2) {
t2++;
}
}
List<Integer> rst = new LinkedList<>();
if (t1 > nums.length / 3) {
rst.add(v1);
}
if (t2 > nums.length / 3) {
rst.add(v2);
}
return rst;
}
/*
Hash 方法,需要额外空间,时间 O(n),空间 O(n)
public List<Integer> majorityElement(int[] nums) {
Map<Integer, Integer> map = new TreeMap<>();
for (int v : nums) {
map.put(v, map.getOrDefault(v, 0) + 1);
}
List<Integer> list = new LinkedList<>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() > nums.length / 3) {
list.add(entry.getKey());
}
}
return list;
}
*/
public static void main(String[] args) {
Solution229 solution = new Solution229();
printVals(solution.majorityElement(new int[] {
1, 2
}));
}
}