專門做圖片的網(wǎng)站有哪些今日軍事新聞
力扣原題鏈接,點擊跳轉(zhuǎn)。
請在一個數(shù)組nums中找出一個子數(shù)組,使得這個子數(shù)組中所有元素的和最大。
你當然可以采取暴力枚舉的方法,但是效率太低。這里我們用動態(tài)規(guī)劃的思想來解決這個問題。首先確定狀態(tài)表示:我們用dp[i]表示以i結(jié)尾的所有子數(shù)組的最大和。
接著推導狀態(tài)轉(zhuǎn)移方程。分類討論:
- 如果以i結(jié)尾的子數(shù)組只包含nums[i],那么和為nums[i]。
- 如果以i結(jié)尾的子數(shù)組長度大于1,那么和為dp[i-1]+nums[i]。
所以,dp[i]=max(nums[i],dp[i-1]+nums[i])。
接著考慮初始化的問題。顯然dp[0]=nums[0]。填表時應按照從左往右的順序。最終應返回整個dp表中的最大值。
class Solution {
public:int maxSubArray(vector<int>& nums) {// 創(chuàng)建dp表int n = nums.size();vector<int> dp(n);// 初始化dp[0] = nums[0];// 從左往右填表for (int i = 1; i < n; i++){dp[i] = max(nums[i], dp[i-1] + nums[i]);}// 返回整個dp表的最大值return *max_element(dp.begin(), dp.end());}
};
當然,你也可以在填表的同時把最大值求了。
class Solution {
public:int maxSubArray(vector<int>& nums) {// 創(chuàng)建dp表int n = nums.size(), ret = 0;vector<int> dp(n);// 初始化ret = dp[0] = nums[0];// 從左往右填表for (int i = 1; i < n; i++){dp[i] = max(nums[i], dp[i-1] + nums[i]);ret = max(ret, dp[i]);}// 返回整個dp表的最大值return ret;}
};