53. 最大子数组和
53. 最大子数组和 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
解:dp/贪心算法
顺序遍历,用一变量sum记录当前子数组和,另一变量res记录最大子数组和。
下标每后移一位更新res,若sum<0后续子数组和必定更小,此时便把sum重置。
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if(nums.size() == 1) 5 return nums.at(0); 6 int res = INT_MIN; 7 int sum = nums.at(0); 8 for(int i = 1;i < nums.size();++i) 9 { 10 res = res > sum?res:sum; 11 sum = sum > 0?sum+nums.at(i):nums.at(i); 12 } 13 res = res > sum?res:sum; 14 return res; 15 } 16 };
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 int result = INT32_MIN; 5 int count = 0; 6 for (int i = 0; i < nums.size(); i++) { 7 count += nums[i]; 8 if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置) 9 result = count; 10 } 11 if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和 12 } 13 return result; 14 } 15 };
//dp原始版
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if (nums.size() == 0) return 0; 5 vector<int> dp(nums.size(), 0); // dp[i]表示包括i之前的最大连续子序列和 6 dp[0] = nums[0]; 7 int result = dp[0]; 8 for (int i = 1; i < nums.size(); i++) { 9 dp[i] = max(dp[i - 1] + nums[i], nums[i]); // 状态转移公式 10 if (dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值 11 } 12 return result; 13 } 14 };
//dp优化版
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if (nums.size() == 0) return 0; 5 int pre,cur=0; // dp[i]表示包括i之前的最大连续子序列和 6 pre = nums[0]; 7 int result = pre; 8 for (int i = 1; i < nums.size(); ++i) { 9 cur = max(pre + nums[i], nums[i]); // 状态转移公式 10 if (cur > result) result = cur; // result 保存dp[i]的最大值 11 pre = cur; 12 } 13 return result; 14 } 15 };
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库