# 每个数字可以选或者不选 defdfs(i): if i < 0: return0 nums[i] = max(dfs(i-1)+nums[i],nums[i]) return nums[i] dfs(len(nums)-1) returnmax(nums)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public:
intdfs(vector<int> & nums, int i){ if (i < 0){return0;} nums[i] = max(nums[i],nums[i]+dfs(nums,i-1)); return nums[i]; }
intmaxSubArray(vector<int>& nums){ dfs(nums,nums.size()-1); int ans = 0; for(int i = 0; i < nums.size(); i++){ ans = max(ans,nums[i]); } return ans; } };
classSolution { public: int dp[100001]; intmaxSubArray(vector<int>& nums){ for(int i = 0; i < nums.size(); i++){ dp[i] = -10000; } dp[0] = nums[0]; int ans = max(-10000,dp[0]); for(int i = 1; i < nums.size(); i++){ dp[i] = max(dp[i-1]+nums[i],nums[i]); ans = max(ans,dp[i]); } return ans; } };
现在已经是迭代了 那有没有什么办法能把空间优化到O(1)呢
我们只需要用变量维持dp[i-1]就行了
以下是最终代码
示例代码
1 2 3 4 5 6 7 8 9
# 时间复杂度:O(n) # 空间复杂度:O(1) classSolution: defmaxSubArray(self, nums: List[int]) -> int: ans = max(-10000,nums[0]) for i inrange(1,len(nums)): nums[i] += max(0,nums[i-1]) ans = max(ans,nums[i]) return ans
1 2 3 4 5 6 7 8 9 10 11 12 13
// 时间复杂度:O(n) // 空间复杂度:O(1) classSolution { public: intmaxSubArray(vector<int>& nums){ int ans = max(-10000,nums[0]); for(int i = 1; i < nums.size(); i++){ nums[i] += max(0,nums[i-1]); ans = max(ans,nums[i]); } return ans; } };