v 題目:連續子陣列求和 ii
給定乙個整數迴圈陣列(頭尾相接),請找出乙個連續的子陣列,使得該子陣列的和最大。輸出答案時,請分別返回第乙個數字和最後乙個數字的值。如果多個答案,請返回其中任意乙個。
v 樣例
給定[3, 1, -100, -3, 4]
, 返回[4,0]
.
v 思路
1.如果不是迴圈陣列,求解連續子區間和的思路如下: 首先設乙個累加變數和sum和最大值變數maxn,[ld, rd]表示當前正在累加的區間,[lt,rt]表示最大和的區間。從左邊開始一直累加,並初始當前區間[ld, rd]的左右兩端的值。如果在累加之前發現sum<0,那麼更新sum為當前的要累加的數字,並且重置新的區間左右兩端的值(即[ld, rd]的值)。另外在累加的過程中,如果sum的值大於maxn,更新maxn的值,並且更新最大值區間(即[lt, rt]改變成[ld, rd])。
2.現在是迴圈陣列,最大和的區間可能會出現在陣列的兩端,也就是陣列的左邊一段和陣列的右邊的一段組成。那麼中間的那一部分就是區間和最小的部分。假設一下左端區間[l1, r1]和右端區間[l2, r2]組成最大和的區間,如果[r1+1, l2-1]不是最小和區間,那麼存在區間[lx, rx]的和比[r1+1, l2-1]區間和更小(其中有lx>r1+1, rx如[-1, 2, -1, 2, -1, 10, -100, 10, 9, 8, 7]
, 這個例子中,最小的區間和是-100,區間[6, 6], 區間[7, 5](注意是迴圈陣列)就是最大的區間和。
v ac**
classsolution
ld = rd =i;
} else}}
ld = rd = 0
;
int lx=0, rx=0
;
int sumx = 0, minn = 0x3f3f3f3f, summ = 0
;
for(int i=0; ii)
ld = rd =i;
} else}}
vector
ans;
if(summ-minn > maxn && lx>0 && rx+1
else
return
ans;}};
LintCode解題筆記 連續子陣列求和
給定乙個整數陣列,請找出乙個連續子陣列,使得該子陣列的和最大。輸出答案時,請分別返回第乙個數字和最後乙個數字的值。如果兩個相同的答案,請返回其中任意乙個 樣例 給定 3,1,3,3,4 返回 1,4 分析 使用start和end來定位a中最大子陣列開始和結束的位置 方法一 暴力遍歷的方式,兩層for...
迴圈單詞(LintCode)
計算陣列中不同的旋轉字串個數 旋轉字串定義為str1經右旋轉後可以得到str2,str1和str2即為相同的旋轉字串。eg picture和turepic即為相同旋轉字串 return3.分析最基本的思路 1.迴圈判斷當前字串和前面的字串是否為旋轉字串 2.如果是就刪除 3.返回剩餘字串個數。如下 ...
LintCode 402 連續子陣列求和
給定乙個整數陣列,請找出乙個連續子陣列,使得該子陣列的和最大。輸出答案時,請分別返回第乙個數字和最後乙個數字的下標。如果兩個相同的答案,請返回其中任意乙個 給定 3,1,3,3,4 返回 1,4 分析 變數ans儲存當前最大的連續子陣列之和,sum表示當前start end之間的和,遍歷陣列,如果s...