1:递归算法(算法来自于网络)
function comb(array$input,int $m): array
{
if($m==1)
{
foreach($input as $item)
{
$result[]=array($item);
}
return $result;
}
for($i=0;$i<=count($input)-$m;$i++)
{
$nextinput=array_slice($input,$i+1);
$nextresult=comb($nextinput,$m-1);
foreach($nextresult as $one)
{
$result[]=array_merge(array($input[$i]),$one);
}
}
return $result;
}
2:移位算法
function combMove(array $input,int $m): array {
$n = count($input);
$moveArr = [];
$moveArr = array_pad(array_fill(0,$m,1),$n,0);
$newArr = [];
array_push($newArr,$moveArr);
$find = true;
while ($find) {
$find = false;
for ($i=0; $i < $n - 1; $i++) {
if ($moveArr[$i] == 1 && $moveArr[$i+1] == 0) {
$find = true;
$moveArr[$i] = 0;
$moveArr[$i+1] = 1;
if ($i >1) {
$newArrs = array_slice($moveArr,0,$i);
$newArrsLeft = array_slice($moveArr, $i);
$newArrMove = moveOneToLeft($newArrs);
$moveArr = array_merge($newArrMove,$newArrsLeft);
}
array_push($newArr,$moveArr));
break;
}
}
}
return $newArr;
}
function moveOneToLeft(array $leftNums): array {
$sum = 0 ;
$newArr = array_count_values($leftNums);
$sum = isset($newArr[1]) ? $newArr[1] : 0;
if ($sum == 0) {
return $leftNums;
}
for($i=0;$i<count($leftNums);$i++){
if($i < $sum){
$leftNums[$i] = 1;
} else {
$leftNums[$i] = 0;
}
}
return $leftNums;
}
总结:两种算法执行效率差不多,按照代码的优雅选择第一种,第二种算法的效率还有优化的可能。