寻找主元素

主元素这个问题,有个nlogn的算法,但是还有比它更快的,有O(n)的算法,基本思想是,从头到尾遍历,先将第一个元素保存到一个变量中,然后依次往后遍历,每遍历到与它的值相同的元素时,就要将它的个数+1, 不同时-1, 这样是因为如果存在主元素,那么主元素的个数一定是大于n/2的,所以最后这样抵消下来剩下的一定是主元素,如果判断它不存在呢,就需要再遍历一遍,看最后找到的这个是不是主元素,其中有个细节就是当那个保存的个数减到0的时候怎么办,如果减到零,就让它等于当前遍历到的这个元素,代码如下,

 1 #include <stdio.h>
 2 const int N = 1000;
 3 int a[N];
 4
 5 int main()
 6 {
 7     int n;
 8     while (~scanf("%d", &n))
 9     {
10         for (int i = 0; i < n; i++)
11             scanf("%d", &a[i]);
12
13         int cur_value = a[0], cur_count = 1;/*cur_value用来保存当前容器中的值,
14         cur_count表示当前值为cur_value的个数 */
15         for (int i = 1; i < n; i++)
16         {
17             if (cur_count == 0)//如果抵消完,将它的值改成当前遍历到元素的值
18             {
19                 cur_count = 1;
20                 cur_value = a[i];
21             }
22             else
23             {
24                 if (cur_value == a[i])//如果相等,就++
25                 {
26                     cur_count++;
27                 }
28                 else//不等,就--
29                     cur_count--;
30             }
31         }
32         int cnt = 0;
33         for (int i = 0; i < n; i++)//判断是否存在主元素
34             if (cur_value == a[i])
35                 cnt++;
36         if (cnt > n / 2)
37             printf("%d\n", cur_value);
38         else
39             puts("NO");
40     }
41
42
43     return 0;
44 }
时间: 2024-11-06 07:30:52

寻找主元素的相关文章

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

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

寻找多数元素/主元素问题

问题描述: 令a[1..n]是一个整数序列,a中的整数x如果在a中出现的次数多于n/2,那么x称为多数元素. 设计一个性能比较优异的算法求解这个问题,找出一个整数序列中的多数元素.当然多数元素要么不存在,要么就只有一个 算法描述: 解决这个问题有好多种方法,蛮力方法就是把序列中的每个元素和其他每个元素比较,并且对每个元素计数,如果某个元素的计数大于n/2,就可以判断它是多数元素,否则无多数元素.但是这样的比较次数是n(n-1)/2=O(n^2),复杂度高.比较有效的算法是先对这些元素排序,并且计

主元素 算法

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

[容易]主元素

题目来源:http://www.lintcode.com/zh-cn/problem/majority-number/ 这道题注意题意,给出的数组一定是存在这个主元素的,不能给一个没有主元素的数组测试. 方法1:穷举法 使用两个for循环计算出每个元素出现的次数, 如果该元素出现次数大于数组元素的二分之一立即返回该元素. 可以accept的程序如下: 1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers 5

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. You may assume that the array is non-empty and the majority element always exist in the array. 求主元素:包含n个元素的数组中,如果一个元素的出现次数大

求数组主元素的递归算法

数组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个元素以后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素. 如果新数组只剩下一个元素,该元素可作为主元素的候选者.新数组是若干个相同元素,该元素可作为主

主元素问题 减治法

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

线性时间内确定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]是否有一个主元素. 算法描述如下: a1 a2 a3 a4 … aj aj+1 … … an 首先取a1 存入m 中,计数器k 置为1. 然后让m 比较a1,a2…,如果与m 相同,则k 加1,如果不同,k 要减1. 这样执行下去, 可能会在比较完aj 时,k=0,这时从新取aj+1 存入m,k 置为1. 重复上述操作

lintcode 主元素解决方法

原题 给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 样例 给出数组[1,1,1,1,2,2,2],返回 1 主要思路 在不考虑时间复杂度的情况下,用for循环从第一个数开始与后面的数依次比较最后返回结果.代码如下: class Solution { public: /** * @param nums: A list of integers * @return: The majority number */ int majorityNumber(vector<