• 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;
  • 相关阅读:
    SQLServer2008对数据分区
    SQL Server2008 1
    [原创]个人工具 照片信息管理器介绍
    【转】C# 实现用艺术效果显示文本的标签控件
    【转】C#如何让WinForm嵌入桌面窗口最底层
    【转】C#使用GDI+制作背景颜色淡入淡出效果的按钮
    【转】C# WinForm程序添加启动画面
    在C#中使用DataTable存储数据
    无题1
    DataGridView 为TextBox初始化,单击事件
  • 原文地址:https://www.cnblogs.com/agentgamer/p/7019790.html
Copyright © 2020-2023  润新知