169 & 229. Majority Element & Majority Element II

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

我们从数组第一个开始找起
如果当前候选人的计数是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;
};

你可能感兴趣的:(169 & 229. Majority Element & Majority Element II)