小菜鳥第一次接觸動態規劃,請多包涵~
給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
在這個問題中,我們將求解最大和連續子陣列分解為求解到當前值的最大連續子串行,而這個最大子串行的求解也是和先前的子串行相關的,我們用maxnum存放子串行,舉例如下:
nums[0]對應的子串行為[-2],最大子串行為[-2]
nums[1]對應的子串行為[-2,1][1],最大子串行為[1]
nums[2]對應的子串行為[-2,1,-3][1,-3][-3],最大子串行為[1,-3]
以此類推····
它們的規律都是比較maxnum[i-1]+nums[i]和nums[i]之間的大小關係
但這還不夠,我們還需要乙個概念才能幫助我們判斷出什麼才是maxnum[i]的值,觀察上面兩個式子(maxnum[i-1]+nums[i]和nums[i]),我們可以發現,什麼時候maxnum[i-1]+nums[i]會大於nums[i],那就是當maxnum[i-1]>0的時候,因為我們可以知道,假若maxnum[i-1]的值小於0,不管nums[i]本身是否大於0,它一定會使得得到的最大連續子串行的值更小
因此我們可以得到下列轉移方程
\[maxnum[i]=
\begin
nums[i]& maxnum[i-1]<0\\
maxnum[i-1]+nums[i]& maxnum[i-1]>=0
\end\]
同時,我們在求得maxnum陣列的時候再用乙個變數隨時更新最大值即可
具體**如下:
class solution
int max = nums[0];
vectormaxnum(nums.size());
maxnum[0] = nums[0];
for(int i = 0; i < nums.size()-1; i++)else
if (max < maxnum[i+1])
}return max;
}};
leetcode刷題記錄
我覺得每天來兩道,練習練習,再看看人家是怎麼優化的。1.給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。c 暴力求解,204ms,9.1m class solution for index,num in enumerate ...
LeetCode刷題記錄
動態規劃和貪心演算法的異同點 class solution throw newruntimeexception 時間複雜度 o n 2 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o n o n 的時間。因此時間複雜度為 o n 2 需要一種方法,尋找符合要求的元...
leetcode刷題記錄
工作之餘刷刷題排解下寂寞 1 面試題66.構建乘積陣列 解題思路 題目要求可以簡化為求陣列中任意乙個元素左右兩邊所有元素的乘積。偷懶就用了乙個套路,練習了p c c python class solution def constructarr self,a list int list int 除法是...