2011-03-15 103 views
2

我有一个叫做$ A的数组,它只包含非零的正数。PHP数组问题

现在我需要找到任意数量的具有给定总和的不同连续子数组。

我将与例如

$A = array(1,2,3,4,5); 

,我期待的总和解释是5

然后有(2, 3)(5)

我试过搜索并得到了一个python代码。我把它翻译给PHP之下,但它拒绝工作

$s = 0; 
for($i = 0; $i < count($A); $i++){ 
    for($j=$i; $j < count($A); $j++){ 
     $s = $s + $A[$j]; 
     if($s == $sum) { 
      echo "[" . $i . " " . $j . "]"; 
     } 
    } 
} 

请帮助。

+6

家庭作业? :))) – 2011-03-15 12:33:04

+1

什么是$ B?何时'$ j jensgram 2011-03-15 12:33:23

+0

另外,你为什么不张贴Python代码? – jensgram 2011-03-15 12:33:43

回答

1

这将工作:

$A = array(1, 2, 3, 4, 5); 
$size = count($A); 
$sum = 5; 
$solution = array(); 
for($i = 0; $i < $size; $i++) { 
    $tempsum = 0; 
    for($j=$i; $j < $size && $tempsum < $sum; $j++) { 
     $tempsum += $A[$j]; 
     if($tempsum === $sum) { 
      $solution[] = array_slice($A, $i, $j - $i + 1); 
     } 
    } 
} 

var_dump($solution); 

至于你的代码中,有一个在它的几个错误:

  1. 您必须重新初始化$ S在每次循环。
  2. 数组$ B可能不存在(第二个循环停止条件)。
  3. 当子阵列的长度大于2时,它不会显示正确的结果。
  4. 不需要第二个循环结束,只要临时总和大于搜索结果,我们可以停下来。
+0

非常感谢。 – Chen 2011-03-15 13:31:32

1

您需要在内循环开始时初始化$s0

for($i = 0; $i < count($A); $i++){ 
    $s = 0; // CHANGE HERE. 
    for($j=$i; $j < count($A); $j++){ 
     $s = $s + $A[$j]; 
     if($s == $sum) { 
      echo "[" . $i . " " . $j . "]"; 
     } 
    } 
} 
+0

这应该是一个评论。 – RobertPitt 2011-03-15 12:40:57

2
  • count($A),你有没有$B
  • $s = 0;第一循环中
  • 不要忘记,$i$j的指标,他们开始在0
  • 不要忘了给一个值$sum开始搜索之前
  • if($s > $sum)您可能想要从continue;秒OND环

祝你好运,
阿林

+1

对于好的指针而不是无证的解决方案+1。 – Nacho 2011-03-15 12:50:13

1
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); // the array to search in 
$b = array(); // the resulting array 
$sum = 9; // the sum to search for 

$w = $a; // $w is the working array which we may modify 
$n = count($w); // number of elements in source array 
for($i = 0; $i < $n; $i++){ 
    $x = 0; 
    $t = array(); 
    if($w[$i] == $sum){ 
     $b[] = array($w[$i]); 
    } 
    if($w[$i] >= $sum){ 
     break; 
    } 
    for($j = $i; $j < $n; $j++){ 
     $x += $w[$j]; 
     $t[] = $w[$j]; 
     if($x == $sum){ 
      $b[] = $t; 
     } 
     if($x >= $sum){ 
      break; // already found the array, continue search 
     } 
    } 
} 

$b将是:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    int(2) 
    [1]=> 
    int(3) 
    [2]=> 
    int(4) 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    int(4) 
    [1]=> 
    int(5) 
    } 
    [2]=> 
    array(1) { 
    [0]=> 
    int(9) 
    } 
} 
+0

当您搜索子数组时,您可以立即停止$ x> $ sum。排序在我看来是错误的,因为我们正在寻找数组的连续子数组,排序可能会改变序列。 – krtek 2011-03-15 13:05:26

+0

好吧,我在'($ x == $ sum)'时停止了搜索。 – mauris 2011-03-15 13:31:32

+0

是的,但是这还不够,'$ x'可以“跳过”'$ sum',然后你将完成整个循环,因为$ x已经大于$ sum。 – krtek 2011-03-15 13:37:06

1

这会工作

<?php 
    $a = array(1,2,3,4,5); 

    $l = sizeof($a); 

    for($i=0; $i<$l; $i++) 
    { 
     for($j=$i+1; $j<$l; $j++) 
     { 
      if($a[$i]+$a[$j] == 5) 
       echo "(".$a[$i]." , ".$a[$j].") <br/>"; 
     } 
     if($a[$i]==5) 
      echo "(".$a[$i].")<br/>"; 
    } 
    ?> 
+0

在很多情况下,这会给出错误的结果。它不会返回长于2个元素的子数组。它会返回[1,4],这不是连续的。而且您可以轻松避免完全冗余的循环的最后部分。 – krtek 2011-03-15 13:09:11