博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记1————求一维数组的主元素
阅读量:3906 次
发布时间:2019-05-23

本文共 1026 字,大约阅读时间需要 3 分钟。

【考研408真题】【leetcode】求一维数组的主元素

主元素是数组内出现次数超过一半的数字,如果有返回该数,否则返回-1,比如【4,4,4,2,3,1,4】返回4,【1,2,1,3,1,3】返回-1

解题思路很多:
(1)时间复杂度达到O(n^2):利用新数组存值,再遍历计数
(2)时间复杂度达到O(nlogn): 先排序(比如快排时间复杂度是O(nlogn)),再判断是否有主元素,事实上如果存在主元素,那么它一定是数组的中位数,只需再遍历一遍就能知道结果
(3)时间复杂度达到O(n):
核心思想
如果一个元素是主元素,去除一个该元素占比一半的子集,该元素在余集中占比仍然超过一半
选定一个候选主元素C,将一个数组分成两部分,前半部分有2k个(偶数个),后半部分有m个。
如果C在前半部分出现了k次,舍弃整个前半部分,并将下一个值赋给C,最后返回的结果是最有可能是主元素的数字(不一定是,还需要最后遍历判断)
比如【3,3,3,2,1,6,3,3,3,2,1】
我们舍弃【3,3,3,2,1,6】,3在剩余部分占比仍然超过一半,最后返回的是3,
比如【3,3,3,4,4,4,5,5,5,6,6】
这个集合没有主元素,返回结果是5,程序的最后遍历数组,得出5的次数,返回-1
再比如更一般的情况【3,4,5,3,4,3,2,3,3】
第一步舍弃【3,4】,第二步舍弃【5,3】,第三部舍弃【3,2】,返回结果3

public static int mainElement(int[]num,int n){        int seed = num[0];        int count = 1;        int i = 0;        //取出主元素        for(i = 1; i
0){ count--; }else{ seed = num[i]; } } } //判断取出的主元素是不是主元素 count = 0; for(i = 0;i
= n/2){ return seed; } return 0; }}

转载地址:http://crqen.baihongyu.com/

你可能感兴趣的文章
qt.network.ssl: QSslSocket: cannot call unresolved function
查看>>
Qt 记录
查看>>
Mac Qt 应用图标
查看>>
QT 实现Dock应用程序点击 ---Mac OS X
查看>>
IOS Resolutions & Display Specifications
查看>>
日期格式化说明
查看>>
储存过程中创建uuid方法
查看>>
MySQL存储过程详解 mysql 存储过程
查看>>
iPhone OS提供的音频单元
查看>>
iOS跳转到app下载页面和app评论页面
查看>>
iOS App被Apple拒绝的原因
查看>>
Xcode5制作Framework
查看>>
using an empty LLDB target which can cause slow memory reads from remote devices.
查看>>
PhoneGap iOS Platform Guide(PhoneGap iOS 平台 交互文档)
查看>>
iOS7 设置状态栏文字颜色
查看>>
Distributing iOS Developer Enterprise Program Applications
查看>>
支付宝,财付通,到底每天都是怎样工作的?
查看>>
工具链无效。新 App 和 App 更新必须使用公共(正式)版 Xcode 6 或更高版本以及 iOS 8 SDK 或更高版本来构建。请勿提交 Beta 版软件构建的 App。
查看>>
Stripping Unwanted Architectures From Dynamic Libraries In Xcode
查看>>
USB文件系统
查看>>