1 <?php 2 #查找一个在数组中出现次数超过一半的数,时间复杂度O(n),空间复杂度O(1) 3 4 #使用b存储数组中某个数,c存储其出现次数 5 #遍历数组,如果b == a[i],则 c++; 6 #如果b != a[i], c == 0, 则 b = a[i], c = 1; 7 #如果b != a[i], c != 0, 则 c--; 8 #易知,如果一个数出现次数超过了一半,则无论其c怎么减,也不可能减到0,并被替换掉 9 #所以数组遍历完以后,b就是出现超过一半的数 10 function search_half($a) { 11 $b = $a[0]; 12 $c = 0; 13 14 foreach ($a as $val) { 15 if ($val == $b) { 16 $c++; 17 } else if ($val != $b) { 18 if ($c == 0) { 19 $b = $val; 20 $c++; 21 } else { 22 $c--; 23 } 24 } 25 } 26 27 return $b; 28 } 29 30 $a = array(1, 5, 2, 3, 1, 2, 4, 2, 2); 31 echo search_half($a); 32 ?>