Majority Element
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
var num = nums.length;
var count = 0;
var item;
for (var i = 0; i<num; i++) {
if (count === 0) {
item = nums[i];
}
if (nums[i]===item)
count++;
else
count--;
}
return item;
};
我们从数组第一个开始找起
如果当前候选人的计数是0,就把当前这个元素当成候选人
如果当前这个元素和候选人相同,候选人计数就加1,不同就减一,如果减至0,就意味着当前候选人在之前的元素中被抵消完了,在已经检查过的元素中,该候选人不满足大于n/2的条件。
Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
现在要求找到个数大于n/3的,这样的数应该最多只有两个。我们拓展一下刚才的方法,使用两个指针
var majorityElement = function(nums) {
var num = nums.length;
if (num === 0)
return [];
var item1,item2;
var c1 = 0;
var c2 = 0;
for (let i = 0;i < num;i++) {
//如果C1和C2都是0,优先给C1
if (c1 === 0&&c2 === 0) {
item1 = nums[i];
c1++;
//如果C1不是0,C2是0
} else if (c1 !== 0&&c2 === 0) {
//检查是不是C1该记录的元素
//是就分给C1,不是就给C2
if (item1 === nums[i]) {
c1++;
} else {
item2 = nums[i];
c2++;
}
//同理
} else if (c1 === 0&&c2 !== 0) {
if (item2 === nums[i]) {
c2++;
} else {
item1 = nums[i];
c1++;
}
//如果C1,C2此时都有分配,那检查当前元素属于谁
} else {
if (item2 === nums[i]) {
c2++;
} else if (item1 === nums[i]) {
c1++;
//如果谁都不属于,那就都减
} else {
c1--;
c2--;
}
}
//更简单的判断方法,思想其实一样的
// if (item1 === nums[i]) {
// c1++;
// } else if (item2 === nums[i]) {
// c2++;
// } else if (c1 === 0) {
// item1 = nums[i];
// c1++;
// } else if (c2 === 0) {
// item2 = nums[i];
// c2++;
// } else {
// c1--;
// c2--;
// }
}
c1 = 0;
c2 = 0;
//现在只能说item1和2是出现次数最多的
//找到当前item1和item2出现的总次数,看看是不是符合题目的要求
for (let i = 0; i < num; i++) {
if (nums[i] == item1)
c1++;
else if (nums[i] == item2)
c2++;
}
var res = [];
if (c1 > num / 3)
res.push(item1);
if (c2 > num / 3)
res.push(item2);
return res;
};