题目描述
给定一个整数数组,找到一个具有最小和的连续子数组。返回其最小和。
样例1
输入:[1, -1, -2, 1]
输出:-3
样例2
输入:[1, -1, -2, 1, -4]
输出:-6
java题解
定义两位数组
第一个比较大小确定当前位置的元素能否为sunArray的起点
第二个记录前 i 个元素能构成sunArray的最小和
public class Solution {
public int minSubArray(List<Integer> nums) {
// write your code here
if (nums == null || nums.size() == 0) {
return 0;
}
int n = nums.size();
int []localMin = new int[n];
int []golbalMin = new int[n];
localMin[0] = golbalMin[0] = nums.get(0);
for(int i = 1; i < n; i++){
localMin[i] = Math.min(localMin[i - 1] + nums.get(i), nums.get(i)); //比较判断是否从一个新的元素开始找SubArray
golbalMin[i] = Math.min(golbalMin[i - 1], localMin[i]);// 前 i 位元素可以构成的最小subArray之和
}
return golbalMin[n - 1];
}
C++题解
思路类似
优化空间的做法
using namespace std;
class Solution {
public:
int minSubArray(vector<int> nums) {
int minSum = nums[0]; // 初始化minSum
int sum = 0;
int maxSum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
if (sum - maxSum < minSum) {
minSum = sum - maxSum; //minSum记录前 i 位元素能够成的最小subArray之和
}
if (sum > maxSum) { // 因为nums中有负数,所以某一段subArray的sum超过0,则舍弃,重置为0
sum = maxSum;
}
}
return minSum;
}
};
python题解
做法和 C++ 类似
class Solution:
def minSubArray(self, nums):
sum = 0
minSum = nums[0]
maxSum = 0
for num in nums:
sum += num
if sum - maxSum < minSum:
minSum = sum - maxSum
if sum > maxSum:
maxSum = sum
return minSum