【LeetCode】NO.53最大子数组和
题目:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
进阶:如果你已经实现复杂度为 O(n)
的解法,尝试使用更为精妙的 分治法 求解。
法一:贪心算法
解题思路:
若当前元素之前的和小于0,则将之前的丢弃。在用历史最大值和当前的值进行比较,保留下最大值。
代码实现:
int maxSubArray(vector<int>& nums) {
int pre=0,Max=nums[0];
for(int i=0;i<nums.size();i++){
pre=max(pre+nums[i],nums[i]);
Max=max(Max,pre);
}
return Max;
}
法二:动态规划
解题思路:
创建一个和nums相同长度的数组arr,先将第一个元素赋给arr,从nums第二个元素开始依次向后遍历,若arr前一位元素大于0,则当前位置的arr为arr前一位加当前nums元素;否则,则当前位置arr等于当前位置nums。最后创建完arr数组后遍历一遍找到最大值,即正确答案。
代码实现:
int maxSubArray(vector<int>& nums) {
int pre=0,Max=nums[0];
for(int i=0;i<nums.size();i++){
pre=max(pre+nums[i],nums[i]);
Max=max(Max,pre);
}
return Max;
}
(○` 3′○) 感谢观看,希望对你有帮助!