主元素

给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。

注意事项

数组中只有唯一的主元素

样例

给出数组[1,2,1,2,1,3,3] 返回 1

挑战

要求时间复杂度为O(n),空间复杂度为O(1)。

标签

LintCode 版权所有 枚举法 贪心 Zenefits

 1 <?php
 2 /**
 3  * 主元素
 4  * 给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一
 5  */
 6 
 7 /**
 8  * 核心思想:一个大小为n的数组中存在一个元素的个数>n/2,则如果用这个数组中的其他的数和该主元素进行抵消的话,最后剩下的一定是主元素,因为主元素的个数最多
 9  * 1.假设数组中第一个元素a(1)为主元素,设count = 1;
10  * 2.声明一个常量size等于数组的大小;
11  * 3.a(1)和a(2)相比,相等count++;否则count--; 然后继续比较a(3),以此类推。
12  * 4.当与a(n)比较后,count = 0时,重新假设a(n+1)为主元素,并继续与a(n+2)作比较。
13  * 5.当count >= (size-m)/2时,此时假设的主元素a(m)即为实际的主元素。或者遍历完整个数组后,当前假设的主元素为实际主元素。
14  */
15 function host_element($data)
16 {
17     if(empty($data))
18     {
19         return false;
20     }
21     $tmp = $data[0];//假设第一个元素为主元素
22     $count = 1;
23     $size = count($data);
24     for($i=1; $i<$size; ++$i)
25     {
26         if(0 == $count)
27         {
28             $tmp = $data[$i];
29         }
30         if($tmp == $data[$i])
31         {
32             $count++;
33         } else {
34             $count--;
35         }
36     }
37     return $count > 0 ? $tmp : false;
38 }
39 
40 $arr = [1, 1, 1, 1, 2, 2, 2];
41 $res = host_element($arr);//返回false或者主元素的值
42 var_dump($res);
原文地址:https://www.cnblogs.com/573583868wuy/p/8763959.html