由k=2联想到的题目 具体解法如下:
空间为O(K),时间为O(K*n)
function in_find($findData,$value) {
foreach($findData as $item){
if($value == $item[1]){
return true;
}
}
return false;
}
function findKMax($data,$k) {
$len = count($data);
$pCur= array();
for($i = 0;$i < $k;$i++){
$pCur[$i] = array(-1,null);
}
$loop = 0;
while(true){
//寻找下一个不同的值
while(true){
$pCur[$loop][0] = $pCur[$loop][0]+1;
if($pCur[$loop][0] >= $len){
return $pCur;
}
if($data[$pCur[$loop][0]] == null){
continue;
}
if( !in_find($pCur,$data[$pCur[$loop][0]]) ){
$pCur[$loop][1] = $data[$pCur[$loop][0]];
$data[$pCur[$loop][0]] = null;
break;
}
}
if($loop == $k - 1){ //同时消除
$loop = 0;
echo $pCur[0][1];echo "\n";
foreach($pCur as &$item){
$item[1] = null;
}
}
else{
$loop++;
}
}
}
$data = array(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,4,3,3,4,4,4,4,4);
shuffle($data);
$res = findKMax($data,$k=4);
print_r($res);
这个题目稍微变下:
数组长度为n,找出出现的次数大于 n/K(k>1)的元素?
此时利用上面的算法,同时记下当前消除的元素,只有当消除的元素大于n/k时,才输出结果。