子数组之和

题目描述:

  给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置

样例

  给出 [-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));

猜你喜欢

转载自www.cnblogs.com/573583868wuy/p/9069868.html