Majority Element出现次数超过一半的数字

2023-05-16

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.

这是一道编程之美和剑指offer上都有的题目。

直观的思路先对数组进行排序,则中间index上存储的数一定是该出现次数超过一半的数字。但是这种操作的时间复杂度为为排序的时间复杂度O(nlogn),不是很理想。

另外一种思路是思路是对快排的改进,即我们不需要对数组进行彻底排序,只需要找到那个在最终排序完的数组中的中间index的那个元素。使用QuickSort的partition来完成这种任务很合适。每次partition会找到 pivot所在的index,可以通过不断二分选择,使最终的pivot的index为(left+right)/2达到目的。

算法时间复杂度平均情况下为O(n)。也是devide and conquer分治的思想。

另外一种思路是既然该数字在数组中出现次数超过一半,则该数字的出现次数比其他所有数字的次数都多。则每次删除数组中两个不同的数,留下的数组中该数字的出现次数依然超过一半。

具体实现时并不是真正去两两删除,而是用一个times和一个result来模拟。result保存数组中的数字,times保存出现的次数。如果下一个数字和我们保存的result中的值不一样,则times的值减1,否则times加1,如果当前times为0,则将result的值赋为当前值,最终result的值为那个出现出现次数超过一半的数的值。代码如下:


class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        times = 1        #开始times初始化
        result = nums[0] #
        for i in nums[1:]:
            if times == 0:
                result = i #重新开始
                times = 1  #重新开始计数
            else:
                if result == i:
                    times += 1
                else:
                    times -= 1
        return result  

注意如何把这段代码和两两删除不同的元素对应上。实际上从result赋值,times为1,到times降为0这个过程,实现的就是删除元素的过程。比如1234,1到2时,times为0,3时times重新等于1,record为3,4时times又降为0,其实就是两两删除的过程。如果有连续值,555534216,则到1时,times也降为0,相当于(5,3),(5,4),(5,2),(5,1)两两删除了。所以在最后一个 times为1,record换值时,record就是那个出现超过一半的数字,一直到数组尾部,也没有那么多和record不同的元素来和它抵消。算法成立。

转载于:https://www.cnblogs.com/sherylwang/p/5474233.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Majority Element出现次数超过一半的数字 的相关文章

随机推荐

  • aida64使用方法_AIDA64中的详细功能使用步骤介绍

    你们知道AIDA64吗 很多的新用户不熟悉AIDA64是怎么使用的 在这里就为你们呈现了AIDA64的详细使用步骤介绍 1 使用AIDA64查看电脑简单信息 打开计算机 系统概述 xff0c 即可查看计算机的一些基本参数包括CPU xff0
  • 万能平板刷机软件_平板电脑怎么刷机 平板电脑刷机方法【教程】

    摘要 xff1a 刷机简单说就是给平板电脑重装系统 xff0c 跟电脑重装系统一样 正常情况下 xff0c 只要硬件没有问题 xff0c 那么就99 99 可以通过刷机搞定你平板上碰到的问题 刷机真的这么神奇么 那么要怎样给平板电脑刷机呢
  • python中strftime函数_Python strftime()用法及代码示例

    在Python中 xff0c 日期和时间不是其自身的数据类型 xff0c 而是名为 strftime 函数用于将日期和时间对象转换为其字符串表示形式 它需要一个或多个格式化代码输入 xff0c 并返回字符串表示形式 用法 strftime
  • signature=cc29255b4425ca4c96b4511e5937abfa,http

    Message ID lt 458798778300 OQB26387 64 intrigue eastciti com gt MIME Version 1 0 Content Type multipart related boundary
  • php ajax等待返回,Ajax对PHP的调用未返回任何内容

    我正在尝试使我的第一个ajax示例在我的MAMP上运行 我的ajax html看起来像 xff1a 我的ajax js看起来像 xff1a 函数ajax gt gt var xmlhttp 如果 window XMLHttpRequest
  • epg信息服务器,EPG系统及EPG信息的实时更新方法

    1 一种EPG系统 包括 播出系统 1 xff0c 所述播出系统 I 包括节目单编辑模块 11 播出在线控制模块 12 和节目单网关模块 13 xff0c 所述节目单网关模块 13 根据节目单编辑模块 11 编辑的节目数据生成EPG信息 x
  • 大华服务器u盘做系统,#测评大玩家#大华P609双接口U盘轻松备份资料

    这些年随着智能手机和5G网络的普及 xff0c 很多人分享资料的时候 xff0c 都习惯使用即时聊天工具 xff0c 对于一些体积较大的文件 xff0c 则是用网盘来完成 不过现在消费者的隐私保护意识越来越高 xff0c 各种网盘服务的价格
  • coursera 计算概论与程序设计基础(李戈)-第二题

    判断闰年 正常情况下一年有365天 xff0c 但是闰年的时候 xff0c 一年有366天 现在给定一个年份 xff0c 请你判断它是不是闰年 凡是能被4整除的年是闰年 xff1b 但逢百之年 xff0c 能被4整除的并不是闰年 xff0c
  • Debian 7 安装使用 Virtualbox及增强功能

    一 安装virtualbox 可以从源里安装 sudo apt get install virtualbox 也可以下载最新版安装 https www virtualbox org wiki Downloads 二 安装增强功能 安装增强功
  • 《你必须知道的.NET》第二次印刷,未来与梦想

    你必须知道的 NET 网站 Anytao技术博客 你必须知道的 NET 第二次印刷 xff0c 未来与梦想 发布日期 xff1a 2008 11 20 作者 xff1a Anytao 2008 Anytao com xff0c Anytao
  • 51学习计划最后

    hhhhhhhhhhh 来了11111111111111111111111111111111111111111111111111111111111111111111111 555 4444 66 77 88 99 00 61 61 61 6
  • sql 跨数据库读取数据库中的数据

    跨数据库读取数据库中的数据 创建链接服务器 右键单击 连接服务器 xff0c 弹出 xff1a 点击 安全性 xff0c 弹出 xff1a 输入连接到的数据库的登陆名和密码 这样链接服务器就创建完成了 这样就可以通过链接服务器的方式查询到链
  • Android系统定制之SystemUI修改:下拉通知栏尺寸【转】

    本文转载自 xff1a https blog csdn net huil0925 article details 67632358 最近项目需要修改下拉通知栏面板的宽度 xff0c 完成后 xff0c 写个Blog做个总结 xff0c 也提
  • git只拉取github部分代码的方法

    需求 xff1a github某个项目所有代码太大 xff0c 有600 43 M xff0c 甚至更大 xff1b 只需要拉取部分代码 xff0c 一是可以降低网络消耗 xff0c 二是可以降低磁盘占用 分析了下空间占用情况 xff1a
  • MatLab计算图像圆度

    本文所述方法可以检测同一图像中的多个圆形 xff08 准确的说 xff0c 应该是闭合图像 xff09 在Matlab2010a中可以实现 附录效果图 xff1a 颗粒圆度 clear close all 读取源图像 I 61 imread
  • RSA签名的PSS模式

    本文由云 43 社区发表 作者 xff1a mariolu 一 什么是PSS模式 xff1f 1 1 两种签名方式之一RSA PSS PSS Probabilistic Signature Scheme 私钥签名流程的一种填充模式 目前主流
  • 爬虫mm131明星照片

    1 39 39 39 2 1 爬取以下站点中各个明星图片 xff0c 分别单独建文件夹存放 3 起始URL地址 xff1a http www mm131 com mingxing 4 39 39 39 5 import os 6 impor
  • 使用IDEA工具配置和运行vue项目(详细其中的坑)

    刚来公司实习发现公司的前端使用的是vue xff0c 之前根本就没有听说过 然后一上来就需要看代码 xff0c but but 就是没有文档什么的东西 xff0c 就需要自己去研读 xff0c 我就想去运行其中的前端和后端联调起来方便理解
  • pycharm永久激活方式

    网上找了好多 xff0c 还是这个最方便快捷 1 下载 链接 https pan baidu com s 1axPsIaedtZDRG7lTup9b5g 密码 7vxp xff0c 并将 JetbrainsCrack 2 10 releas
  • 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