本文准备讲解1个算法编程问题, 这个算法编程问题来自LintCode平台。不了解.LintCode平台的读者可以阅读笔者文章(在线编程平台推荐-LeetCode)。问题的英文版本描述如下:
Minimum Subarray
Given an array of integers, find the subarray with smallest sum.
Return the sum of the subarray.
Notice
The subarray should contain one integer at least.
Example
For[1, -1, -2, 1], return -3.
问题的中文版本描述:
最小子数组
给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。
Notice
子数组最少包含一个数字
Example
给出数组[1, -1, -2, 1],返回 -3
这个问题可以选用最简单的全路径排列方法:对数组[1, -1, -2, 1],含有首数据1的所有新增可能路径为[1],[1,-1],[1,-1,-2]和[1,-1,-2,1]; 含有数据-1的所有可能新增路径为[-1],[-1,-2],[-1,-2,1];含有数据-2的所有新增可能路径为[-2],[-2,1]; 含有数据1的所有新增可能路径为[1];对每个可能路径计算处理可得出最小和。
标准算法需要对目标数组做特殊的计算处理。使用变量 localmin1 记录前节点参于的最低和,使用变量 localmin 记录本节点参于的最低和,使用变量 globalmin 记录最低和。对数组[1, -1, -1, 1],首数据1节点:localmin1 为 0,localmin 为1,globalmin 为1;数据-1节点:localmin1 为 1,localmin 为 -1,globalmin 为 -1;数据-1节点:localmin1 为 -1,localmin 为-2,globalmin 为-2;数据1节点:localmin1 为 -2,localmin 为-1,globalmin 为-2。该算法难度稍高,但效率比较高。