开发者社区> 问答> 正文

怎么用php实现用最少的迭代,使数组所有元素变换为平均值(平衡)

输入:数组,所有值为非负整数
目标:通过变换使数组的每个值为所有值的平均值,并且迭代次数最少
变换方法:某个值自身减一,使其紧邻左边或紧邻右边的值加一。数组第一个值只能向右传递1,最后一个向左传递1. 变换过程中数组内所有值不可为负。
例1:

输入 : [0, 3, 3]
第一次: [1, 2, 3] [1, 3, 2]
第二次: [2, 2, 2]

例2

[2, 4, 6, 2, 1]
[3, 3, 5, 2, 2]
[3, 3, 4, 2, 3]
[3, 3, 3, 3, 3]

例3

[1, 0, 7, 0]
[1, 1, 6, 0]
[2, 1, 5, 0]
[2, 2, 4, 0]
[2, 2, 3, 1]
[2, 2, 2, 2]

这个问题有什么好的算法解决吗,例子不是唯一解。求思路,用php实现。

展开
收起
小旋风柴进 2016-03-06 10:17:37 2384 0
1 条回答
写回答
取消 提交回答
  • $ar = [0, 3, 3];
    $ar = [2, 4, 6, 2, 1];
    $ar = [1, 0, 7, 0];
    $ar = [5, 5, 5, 5, 25];
    
    do {
      $loop = 0;
      for($i=0; $i<count($ar) - 1; $i++) {
        if($n = casecmp($ar[$i], $ar[$i+1])) {
          $ar[$i] += $n;
          $ar[$i+1] -= $n;
          $loop++;
        }
      }
      printf("[%s]\n", join(', ', $ar));
    }while($loop);
    
    function casecmp($a, $b) {
      if($a == $b) return 0;
      return $a > $b ? -1 : 1;
    }
    2019-07-17 18:54:09
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载