原題如下所示:
連續子數組求和
給定一個整數數組,請找出一個連續子數組,使得該子數組的和最大。輸出答案時,請分別返回第一個數字和最後一個數字的下標。(如果兩個相同的答案,請返回其中任意一個)
給定 [-3, 1, 3, -3, 4]
,
返回[1,4]
.
1、一看到題目就覺得是動態規劃的問題,可以定義一個和輸入數組相等大小的數組sum,用來存放到當前位置爲止的最大子數組和,然後求出該數組中最大值所在的位置就是輸出的右側的位置;
2、求左側位置的時候,可以發現,最大的子數組的和一定是sum中,從第一個大於0的數開始的,所以從右側往前查找到第一個小於0的數,其+1就是左側的值。
具體的C++代碼如下:
class Solution {
public:
/**
* @param A an integer array
* @return A list of integers includes the index of
* the first number and the index of the last number
*/
vector<int> continuousSubarraySum(vector<int>& A) {
// Write your code here
vector<int> res;
if(A.size()==0)
{
return res;
}
else
{
int len=A.size();
vector<int> sum(len,0);
sum[0]=A[0];
int left,right;
int i;
for(i=1;i<len;i++)
{
sum[i]=max(A[i],A[i]+sum[i-1]);
}
int max=sum[0];
for(i=1;i<len;i++)
{
if(sum[i]>max)
{
max=sum[i];
right=i;
}
}
if(sum[right]==A[right])
{
res.push_back(right);
res.push_back(right);
}
else
{
for (i = right; i>=0; i--)
{
if (sum[i] <0)
{
left = i+1;
break;
}
}
res.push_back(left);
res.push_back(right);
}
return res;
}
}
};