主元素这个问题,有个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