x称为一个长度为n的数组的a的主元素,如果这个数组里面等于x的元素的数目不少于n/2个。

例如,a={2,3,2,2,5,3,2,4,2},x=2就是这个主元素。给定包含n个元素的数组a,主元素问题就是判断数组a是否包含一个主元素x。

三个方法实现:

方法一:

求中文书,主元素可定是中位数,否则该元素数量少于n/2则不是主元素;快速排序,然后确定中位数时间复杂度O(nlogn)

方法二:

分子思想:

若T中存在主元素,则将T分为两个部分,T的主元素也必为两部分中至少一部分的主元素,因此可用分治法。

将主元素划分为两部分,递归地检查两部分有无主元素。算法如下:

a.若T只含有一个元素,则吃元素就是主元素,返回此数。

b.讲T分为两部分T1和T2(两者元素个数相等或者差一),分别使用递归方法求其主元素m1和m2.

c.若m1和m2都存在且相等,则这个数就是T的主元素,返回此数。

d.若m1和m2都存在且不相等,则分别检查者两个数是否为T的主元素,若有,则返回此数,若无则返回空值。

e.若m1和m2只有一个存在,则检查这个数是否为T的主元素,若是则返回此数,若否就返回空值。

f.若m1和m2都不存在,则T无主元素,返回空值。

方法三:

思路比较新颖,原理是如果一个元素中存在一个主元素(个数大余n/2),则同时删除两个不相等的数,这个主元素不会改变。

简单的说就是一个大小为n的数组中存在一个元素的个数大余n/2,则如果用这个数组中其他的数和该主元素进行抵消的话,最后剩下的一定是主元素,因为主元素个数最多。

该方法可以在O(n)时间内找到主元素。十分高效。

方法一代码:

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {2,3,2,2,5,3,2,4,2};
int i = 0;
Arrays.sort(a);
int index = a.length/2;
if(a[0]==a[index]||a[a.length-1]==a[index]){
System.out.println(a[index]);
}
}
}

方法二代码:

方法三代码:

public class Main {

    public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {3,5,4,3,3,3,2,3,2};
int mainE = mainElement(a, 9);
System.out.println(mainE);
}
public static int mainElement(int[]num,int n){
int seed = num[0];
int count = 1;
int i = 0;
//取出主元素
for(i = 1; i<n;i++){
if(seed==num[i]){
count++;
}else{
if(count>0){
count--;
}else{
seed = num[i];
}
}
}
//判断取出的主元素是不是主元素
count = 0;
for(i = 0;i<n;i++){
if(num[i] == seed){
count++;
}
}
if(count >= n/2){
return seed;
}
return 0;
} }

主元素问题(Java)的更多相关文章

  1. lintcode 中等题:majority number III主元素III

    题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...

  2. lintcode 中等题:Majority number II 主元素 II

    题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...

  3. 线性时间内确定T[0:n]是否有一个主元素

    设T[0:n-1]是n 个元素的数组.对任一元素x,设S(x)={ i | T[i]=x}.当| S(x) |>n/2 时,称x 为T 的主元素.设计一个算法,确定T[0:n-1]是否有一个主元 ...

  4. lintcode.46 主元素

    给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 注意事项 You may assume that the array is non-empty and the ma ...

  5. LintCode主元素

    主元素1: 这道题是编程之美上的一道原题,如果题目未对时间复杂度有严格要求的话可以先排序,再取中位数. 本题中要求算法达到时间复杂度为O(n),空间复杂度为O(1),算法如下: public int ...

  6. Ex 2_23 如果一个数组超过半数的元素都相同时,该数组被称为含有一个主元素..._第二次作业

    将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是 ...

  7. 主元素问题 Majority Element

    2018-09-23 13:25:40 主元素问题是一个非常经典的问题,一般来说,主元素问题指的是数组中元素个数大于一半的数字,显然这个问题可以通过遍历计数解决,时间复杂度为O(n),空间复杂度为O( ...

  8. 【算法31】寻找数组的主元素(Majority Element)

    题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以 ...

  9. 主元素 II

    主元素 II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时间复 ...

随机推荐

  1. 第六篇 javascript面向对象

    一.闭包 闭包是指可以包含自由(未绑定到特定对象)变量的代码块. 「闭包」,是指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包是个函数,而它「记 ...

  2. 每个程序员都应该了解的 CPU 高速缓存

    每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches 来源:oschina [编者按:这是Ulrich Drepper写“程序员都该知道存储器”的第二 ...

  3. 双系统重装win7和ubuntu修复win7引导方法介绍(来源百度经验)

    很多朋友喜欢为电脑安装win7和ubuntu双系统,当我们重装双系统时,可能会出现win7引导不见的情况,接下来就告诉大家双系统重装win7和ubuntu修复win7引导的方法. 1.win7和ubu ...

  4. HTTP-接触

    [HTTP]http是基于TCP/IP协议的应用层协议,他不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认端口是80端口. 不同版本http协议里的相关概念[Conten ...

  5. C# WinForm开发DataGridView 使用

    1.C# WinForm开发系列 - DataGridView 使用:(http://group.cnblogs.com/topic/40730.html) 2.C# — WinForm DataGr ...

  6. PHP如何得到数组最后元素的key

    1.array_keys(end($arr)) $array = array( 'one'=>1, 'two'=>2, 'three'=>3, 'four'=>4, ); $a ...

  7. codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)

    D. Ant on the Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. codeforces 633B B. A Trivial Problem(数论)

    B. A Trivial Problem time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  9. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  10. codevs1020 孪生蜘蛛

    1020 孪生蜘蛛   题目描述 Description 在G城保卫战中,超级孪生蜘蛛Phantom001和Phantom002作为第三层防卫被派往守护内城南端一带极为隐秘的通道. 根据防护中心的消息 ...