求数组主元素的递归算法

数组A是具有n个元素的数组,x是A中的一个元素,若A中有一半以上的元素与A相同,则称x是数组A的主元素。例如 ,数组A={1,3,2,3,3,4,3},元素3就是该数组的主元素。

1、移去数组中的两个不同元素后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素。

2、如果数组2k个元素中有k个元素相同(k<n/2),移去这2k个元素以后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素。

如果新数组只剩下一个元素,该元素可作为主元素的候选者。新数组是若干个相同元素,该元素可作为主元素的候选者。没有剩下元素时,则原来数组没有主元素。

count为一个初值为0的计数器,当扫描元素时,如果当前元素和num表示的元素相等,则计数器加1,否则计数器减1.当所有元素扫面以后,如果计数器大于0,说明数组还有若干个与num相等的元素未移除,则num为主元素候选者。

 1 public class Demo<T> {
 2
 3     public T num;
 4     public T A[];
 5
 6     public Demo(T A[]) {
 7         this.A = A;
 8     }
 9
10     public boolean candidate(int m) {
11         int count = 1;
12         int i = m;
13         int n = A.length;
14         num = A[i];
15         while (i < n - 1 && count > 0) {
16             if (A[++i].equals(num))
17                 count++;
18             else
19                 count--;
20         }
21         if (i == n - 1 && count > 0)
22             return true;
23         else if (i == n - 1 && count == 0) {
24             return false;
25         } else
26             return candidate(i + 1);
27     }
28
29     public boolean majority() {
30         int count = 0;
31         boolean flag = candidate(0);
32
33         if (flag) {
34             for (T a : A) {
35                 if (num.equals(a))
36                     count++;
37             }
38             if (count < A.length / 2)
39                 return false;
40         }
41         return flag;
42     }
43
44     public T getNum() {
45         return num;
46     }
47
48     public static void main(String[] args) {
49
50         String A[] = {"a", "c", "a", "b", "a" };
51         Demo<String> d1 = new Demo<>(A);
52         boolean sign = d1.majority();
53         if (sign) {
54             System.out.println(d1.getNum());
55         } else
56             System.out.println("主元素不存在");
57     }
58 }
时间: 2024-08-07 16:48:42

求数组主元素的递归算法的相关文章

已知一个数组,求数组中心元素

/** * */package Student_System;import java.util.*;import java.util.*;/**Homework11 * *Homework1101 *已知一个数组,求数组中心元素 * @author 读你一世 * * QQ: 1816274408 *2017年4月11日上午10:25:03 * */public class Homework1101 { public static void main(String[] args){ Scanner

2013 查找数组主元素

算法思想:计数排序,建立一个辅助数组,遍历数组a,有一个数就把辅助数组相应位置元素+1,最后遍历一遍数组,找到出现最多的主元素 代码: int majority(int a[],int n) { int k,*p,max; p=(int *)malloc(sizeof(int)*n)//辅助数组 for(k=0;k<n;k++)p[k]=0; max=0; for(k=0;k<n;k++) { p[a[k]]++; if(p[a[k]]>p[max])max=a[k];//记录出现次数最

偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2013/01/30/394920.html 其中下面有人评论为: 有序列表查找显然二分啊,博主貌似对java的arrays和collections不是很熟. private static int getMinAbsoluteValue(final int[] source) { int index

求数组中元素的最大值

#include <stdio.h> int main(void) { int a[10] = {20,123,4543,556,34,5,54,43,234,53}; int max = a[0]; int i; for(i=1;i<10;i++){ if(max<a[i]){ max = a[i]; } } printf("max=%d\n",max); return 0; }

求数组(元素可为正数、负数、0)的最大子序列和。

int max_sum(int *arr,int len) { assert(arr); assert(len > 0); int sum=0; int key=-INT_MAX; for(int i=0; i<len; ++i) { if(sum <= 0) sum=arr[i]; else sum+=arr[i]; if(sum >= key) key=sum; } return key; }

主元素 算法

问题描述: 设T[0:n-1]是n个元素的数组.对任一元素x,设S(x)={i|T[i]=x}.当|S(x)|>n/2时,称x为T的主元素.设计一个线性时间算法,确定T[0:n-1]是否有一个主元素. 分析与解答: (1)基于分治法的线性期望时间求主元素算法 中位数:数列排序后位于最中间的那个数,如果一个数列有主元素,那么必然是中位数.求一个数列有没有主元素,只要看中位数是不是主元素. 找中位数的方法:选择一个元素作为划分起点,然后用快速排序的方法将小于它的移动到左边,大于它的移动到右边.这样将

主元素问题 减治法

一个有n个元素的序列A中,出现次数大于n/2的元素称为主元素.现给定一个序列(保证存在主元素),求其主元素. 一种思路是Boyer和Moore提出的减治法,可以在线性时间内求得主元素.如果不确定序列是否存在主元素,还需要再加一个线性的判断. 以下假设A的主元素存在,且出现了k次,则其他元素出现的次数为n - k,二者的差记为c = 2k-n.可知x为主元素当且仅当 c > 0. 考查序列A的长度为2m的前缀P,若其中某个元素 x 出现的次数达到m,则此时可减而治之,分析如下,参考了数据结构课本的

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

题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以及数学证明,只是照搬的话好像意义也不是很大,希望找到些有代表性的题目在更新,另外希望能接着前面的<穷举递归和回溯算法终结篇>一系列如动态规划.贪心算法类的终结篇,在梳理自己知识结构的同时也能够帮助读者们更系统的学习算法思想.好了话不多说,进入正题. 问题描述 给定一个数组A[n], 定义数组的主元

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

将数组A划分为两个数组A1和A2 ,各含有A的一半元素或一半多一个.若A中含有主元素x,则A1和A2中至少有一个数组含有主元素x,对A1和A2递归地计算有无主元素,若A只含有一个元素,则A的主元素就是这个元素,否则计算出A1和A2的主元素x1和x2: 若x1和x2都不存在,则A不存在主元素 若x1和x2有一个存在,则检查这个元素是否为A的主元素 若x1和x2都存在且不相等,则分别检查这个元素是否为A的主元素 若x1和x2都存在且相等,则这个元素就是A的,主元素 1 package org.xiu