lintcode刷題--連續子數組求和

原題如下所示:

連續子數組求和 

給定一個整數數組,請找出一個連續子數組,使得該子數組的和最大。輸出答案時,請分別返回第一個數字和最後一個數字的下標。(如果兩個相同的答案,請返回其中任意一個)

樣例

給定 [-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;
            
        }
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章