- Minimum Subarray
Given an array of integers, find the continuous subarray with smallest sum.
Return the sum of the subarray.
Example
Example 1
Input:[1, -1, -2, 1]
Output:-3
Example 2
Input:[1, -1, -2, 1, -4]
Output:-6
Notice
The subarray should contain one integer at least.
解法1:
双指针法。当sum > 0时,start和end都重新计算。但注意这里如果当前元素>0,那么start和end的位置就是end+1,否则,start和end的位置就是当前位置。
class Solution {
public:
/*
* @param nums: a list of integers
* @return: A integer indicate the sum of minimum subarray
*/
int minSubArray(vector<int> &nums) {
int n = nums.size();
int start = 0, end = 0;
int sum = 0, minSum = INT_MAX;
while (end < n && start <= end) {
sum += nums[end];
minSum = min(minSum, sum);
if (sum > 0) {
start = nums[end] > 0 ? end + 1 : end;
end = start;
sum = 0; // nums[start];
}
else {
end++;
}
}
return min(minSum, nums[n - 1]);
}
};
解法2:参考网上。
跟解法1差不多。这里可以看出i就是上面的end,其实上面的start
代码如下
class Solution {
public:
int minSubArray(vector<int> nums) {
int minSum = nums[0]; // 初始化minSum
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
if (sum < minSum) {
minSum = sum; //minSum记录前 i 位元素能够成的最小subArray之和
}
if (sum > 0) { // 因为nums中有负数,所以某一段subArray的sum超过0,则舍弃,重置为0
sum = 0;
}
}
return minSum;
}
};
代码同步在
https://github.com/luqian2017/Algorithm