LintCode解題筆記 連續子陣列求和

2021-07-04 02:06:45 字數 1171 閱讀 1644

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

樣例 給定 [-3, 1, 3, -3, 4], 返回[1,4].

分析:

使用start和end來定位a中最大子陣列開始和結束的位置

方法一: 暴力遍歷的方式,兩層for迴圈定位到i,j,然後求陣列a[i..j]的和,求和的複雜度是o(n), 兩層遍歷的時間複雜度是o(n*n), 則一共遍歷複雜度是o(n*n*n)

方法二:採用dp動態規劃方式,假設sum[i],是前i項的最大值max,

如果sum[i] >0,判斷a[i+1]的符號,如果a[i+1]<0, 則a[i+1]無法增大max的值,因此sum[i+1]還是max,start和end的標識不變。如果a[i+1]>0,則a[i+1]對總和最大有正向貢獻,因此sum[i+1] = sum[i] + a[i+1], 同時end指向i+1

如果sum[i]<0, 說明前i項對總和是負向貢獻,因此需要重新開闢求和的位置,sum[i+1]捨棄前i項的和,直接從a[i+1]開始,sum[i+1] = a[i+1], start and end 重新定位到i+1

迴圈,直到遍歷a結束,那麼複雜度就是o(n)

class solution 

int start=0;

int end=0;

long max;

long current;

vector

vect;

int sum[a.size()];

//init

vect.clear();

vect.push_back(0);

vect.push_back(0);

for(int i = 0; i0;

}sum[0]=a[0];

int f_start = 0;

int f_end = 0;

for(int i=1, max=a[0]; i< a.size(); i++)else

//max = (max > sum[i])? max:sum[i];

if(max < sum[i])

}if(f_start!=0 || f_end!=0)

return vect;

}};

Lintcode解題報告

1.num.196 尋找缺失的數 給出乙個包含 0 n 中 n 個數的序列,找出0 n 中沒有出現在序列中的那個數。注意事項 可以改變序列中數的位置。您在真實的面試中是否遇到過這個題?yes樣例n 4且序列為 0,1,3 時,缺失的數為2。1.可以1 n 1求和再減去陣列中數字的總和,差值即為缺失的...

Lintcode 114 最大上公升連續子串行

給定乙個整數陣列 下標從 0 到 n 1,n 表示整個陣列的規模 請找出該陣列中的最長上公升連續子串行。最長上公升連續子串行可以定義為從右到左或從左到右的序列。注意事項 time 您在真實的面試中是否遇到過這個題?yes 樣例給定 5,4,2,1,3 其最長上公升連續子串行 lics 為 5,4,2...

lintcode迴圈陣列之連續子陣列求和

v 題目 連續子陣列求和 ii 給定乙個整數迴圈陣列 頭尾相接 請找出乙個連續的子陣列,使得該子陣列的和最大。輸出答案時,請分別返回第乙個數字和最後乙個數字的值。如果多個答案,請返回其中任意乙個。v 樣例 給定 3,1,100,3,4 返回 4,0 v 思路 1.如果不是迴圈陣列,求解連續子區間和的...