You may assume that the array is non-empty and the majority element always exist in the array.
1.首先想到的解法是先sort 之后返回中间的值就可以了 类似滑动窗口 滑动窗口的长度>2/n 所以无论怎么移动 都会覆盖掉中间的值
比如 1,2,3,1,1,2,1,1 排序之后 1,1,1,1,1,2,2,3 中间的位置一定会被majority element占据
时间复杂度较高 用到了排序 O(nlgn)
2.比O(nlgn)低的时间复杂度 就是O(n)了 也就是扫描
做法是用一个map<Integer, Integer>记录数字和对应的出现次数
public int majorityElement(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
int count = map.getOrDefault(n, 0) + 1;
if (count > nums.length/2) return n;
map.put(n, count);
}
return -1;
}
但是空间复杂度较高 O(n)3.降低空间复杂度 也就是去掉map
这里是用的是类似"抵消"思想
先拿nums[0]作为majority element,此时majority的count=1
之后后面的元素如果等于nums[0],count+1;不等于nums[0],count-1
如果count=0了,说明到目前为止,不等于nums[0]的多于等于nums[0]的,那么majority element进行重新选举
如果nums[0]真的是majority element,只是前面出现的次数很少,后面出现的次数很多,没关系,nums[0]肯定还会被再次选中
public int majorityElement(int[] nums) {
int count = 0, major = 0;
for (int i=0; i<nums.length; i++) {
if (count==0) {
major = nums[i];
}
if (nums[i]!=major) {
count--;
} else {
count++;
}
}
return major;
}