给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
注意事项
数组中只有唯一的主元素
样例
给出数组[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);