zoukankan      html  css  js  c++  java
  • Majority Element

    https://leetcode.com/problems/majority-element/#/description

    挑出多余n/2 的元素,这个题有很多答案。

    1. hash 表计数,这个不用说。

    2. 排序然后线性扫一遍这个要nlogn。

    3. divide & conqur. 这个不太理解-_-

    4.majority vote 这个就比较厉害了,只用O(n) 的时间和O(1) 的空间。

    5. 位投票,不知道这个点子是怎么被想出来的,非常有趣。

    majority vote:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/

    流程就是,一个变量t 作为当前投票最多的candidate,另一个变量n 是他的投票数。遍历数组,如果num[i] == t 就n++ 否则就n--。如果n ==0 那么t 就下台,换下一个candidate

    这样可以证明当i == array.length 的时候,t 是major,iff 存在major。因为n 是count(major) - count(other) 如果major 存在那么肯定大于0,而n >0 的那个必定是major。

    var majorityElement = function(nums) {
        var major = nums[0];
        var count = 1;
        for (var i = 1; i < nums.length; i++) {
            if (count === 0) {
                major = nums[i];
                count = 1;
            } else if (nums[i] !== major) {
                count--;
            } else {
                count++;
            }
        }
    
        return major;
    };

    另一个位投票的方法也很厉害,假设数组元素是32 位整型,那么我们就生成32 个mask,第i 个mask 的第i 位是1,其余位都是0。

    形式如同:

    0: 0001

    1: 0010

    2: 0100

    。。。。

    然后对于每个mask,用数组里的每个元素做& 操作,如果结果不为0,则对与这个mask 来说,它的投票加一,当数组遍历完如果票数>n/2 就说明major 的这个位为1。所以 major |= mask

    这样等32 个mask 都投完票以后major 也组装完毕了

        var mask = 1;
        var len = nums.length;
        var major = 0;
        var majors =[];
        for (var i = 0, mask = 1; i < 32; i++, mask <<= 1) {
            var count = 0;
            for (var j = 0; j < len; j++) {
                if (mask & nums[j]) {
                    count++;
                }
                if (count > len / 2) {
                    major |= mask;
                    break;
                }
            }
        }
    
        return major;
  • 相关阅读:
    ArrayList源码剖析
    Java集合框架
    Java数据结构和算法(十五)——无权无向图
    Java数据结构和算法(十四)——堆
    Java数据结构和算法(十三)——哈希表
    Java数据结构和算法(十二)——2-3-4树
    Java数据结构和算法(十一)——红黑树
    Java数据结构和算法(十)——二叉树
    Java数据结构和算法(九)——高级排序
    [刷题] Leetcode算法 (2020-2-27)
  • 原文地址:https://www.cnblogs.com/agentgamer/p/7019790.html
Copyright © 2011-2022 走看看