题目描述:
给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置
样例
给出 [-3, 1, 2, -3, 4]
,返回[0, 2]
或者 [1, 3]
.
1 <?php 2 /* 3 * 子数组之后 4 * 给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置 5 */ 6 7 /** 8 * 方法一: 9 * 两次for循环,每次取出一个元素依次与后面的元素相加 10 */ 11 12 function solution1($data) 13 { 14 $res = [];//用于存储结果 15 $sum = 0;//子数组之和 16 $count = count($data); 17 for($i=0; $i<$count; ++$i) 18 { 19 $sum = $data[$i]; 20 if(0 == $sum) 21 { 22 $res[] = [$i, $i]; 23 } 24 for($j=$i+1; $j<$count; ++$j) 25 { 26 $sum += $data[$j]; 27 if(0 == $sum) 28 { 29 $res[] = [$i, $j]; 30 } 31 } 32 } 33 return $res; 34 } 35 36 /** 37 * 方法二 38 * 用一个数组存储当前元素的key以及累加值,若出现两个一样的值,则表示两个一样的值中间的数组之和为0 39 * [-3, 1, 2, -3, 4] 40 * key -1 0 1 2 3 4 41 * value 0 -3 -2 0 -3 1 42 * key值在(-1, 2]、(0, 3]之前存在和为0的子数组 43 */ 44 function solution2($data) 45 { 46 $maps[-1] = 0; 47 $sum = 0; 48 $res = []; 49 foreach($data as $k=>$v) 50 { 51 $sum += $v; 52 $maps[$k] = $sum; 53 if($tmp = array_keys($maps, $sum)) 54 { 55 foreach($tmp as $value) 56 { 57 $value != $k && $res[] = [$value+1, $k];//maps中存在当前和的值,且不等于key值不等于当前key 58 } 59 } 60 } 61 return $res; 62 } 63 64 65 function show($info) 66 { 67 echo "<pre>"; 68 print_r($info); 69 } 70 71 $data = [0, -3, 1, 2, 0, -3, 4, -4]; 72 show(solution1($data)); 73 //$data = [-3, 1, 2, -3, 4]; 74 show(solution2($data));