【原创】求取最少切割数量及位置

【原创】求取最少切割数量及位置

// 初始数据
$data = array( array(1,2,2), array(3,1,2), array(2,2,2),
      array(1,3,2), array(2,4), array(1,1,2,2)
);
$allArr = $temp = array();
$maxArr = array();  // 将所有最大值放到一个数组里
$sum    = 0;
// 重新分配数据
foreach($data as $key=>$val){
      $tempArr = array();
      $total   = count($val);
      for($i=1; $i<=$total; $i++){
            $temp      = array_slice($val, 0, $i);  // 从每个数组第0个位置开始切,每次切$i个
            $sum       = array_sum($temp);  // 计算切完之后里面的所有值相加的总和
            $tempArr[] = $sum;  // 将所有数值保存到数组里
            if($i === $total){
                  $maxArr[] = $sum;
            }
      }
      $allArr[] = $tempArr;  // 将数据保存到一个大的数组里
}
rsort($maxArr);  // 倒序排列   array(6,6,6,6,6,5);
$max = current($maxArr);  // 即获取数组里面的最大总和,因为是倒叙,所以,默认是第一个   6
$unique = array_unique($maxArr);  // 将所有最大值唯一化,主要用于后面的过滤
// 整合后的数据
// $data = array( array(1,3,5), array(3,4,6), array(2,4,6),array(1,4,6), array(2,6), array(1,2,4,6));
// 对数据进行重新统计
$stat = array();
foreach($allArr as $key=>$val){
      for($i=1; $i<=$max; $i++){
            if(in_array($i, $val)){
                  if(isset($stat[$i])){
                        $stat[$i] = $stat[$i]+1;
                  }else{
                        $stat[$i] = 1;
                  }
            }
      }
}
arsort($stat);  // 倒序排列  array(6=>5,4=>4,1=>3,2=>3,3=>2,5=>1)
foreach($stat as $k=>$v){  // 过滤掉最后的那条线的位置
      if(in_array($k,$unique)){
            unset($stat[$k]);
      }
}
// array(4=>4,1=>3,2=>3,3=>2,5=>1)
// 默认只有一个位置的时候
$key   = key($stat);  // 穿越的位置
$value = current($stat);
$num   = count($data)-$value;  // 穿越的个数
var_dump($key.‘—–‘.$num);  // 4—–2
// 如果是存在多个位置的话,说明空隙值是相同的
$first  = $value;
$posArr = array();
foreach($stat as $k=>$v){
      if($first == $v){  // 将等于最大空隙值的放入到一个数组里
            $posArr[] = $k;
      }
}
var_dump($posArr);  // 这个打印出来的结果是  array(4);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据