最小子数组

题目描述:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。

样例:给出数组[1, -1, -2, 1],返回 -3

 1 <?php
 2 /**
 3  * 最小子数组
 4  * 给定一个整数数组,找到一个具有最小和的子数组。返回其最小和
 5  */
 6 include "./show.php";//定义了一个类似于var_dump()的方法
 7 
 8 /*
 9  * 1. 依次求取前n位的和, 那么,当然有两种情况:和为正;和为负
10  * 2. 如果和为负,那么加上第n + 1位起,之后的某段数组是有意义的。我们可以假设第n + 1位起,到第m位,和为-10,而前n位的和为-3,两个一加得-13,肯定比-10小
11  * 3. 而如果和为正,则不管再加入怎样一段数组,都是没有意义的,因为那一段被加入的数组,"不带"前n位"玩",自己会更小
12  */
13 function min_sub_array($data)
14 {
15     if(empty($data))
16     {
17         return false;
18     }
19     $min_sum = $data[0];
20     $sum = 0;
21     foreach($data as $v)
22     {
23         $sum += $v;
24         if($sum < $min_sum)
25         {
26             $min_sum = $sum;
27         }
28         if($sum > 0)
29         {
30             $sum = 0;
31         }
32     }
33     return $min_sum;
34 }
35 
36 $arr = [1, -1, -2, 1];
37 $res = min_sub_array($arr);
38 show($res);

 

转载于:https://www.cnblogs.com/573583868wuy/p/8749219.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值