LeetCode 53. 最大子数组和 (动态规划+贪心——C/C++/Python)

在这里插入图片描述

欢迎加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。



关注专栏《算法题LeetCode》,高效刷题,本专栏使用C./C++/Python三种语言,多种解法刷题,题目来源为力扣。


题目描述

给你一个整数数组 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

☞动态规划解法

C语言版

/*动态规划 O(n)*/
int maxSubArray(int* nums, int numsSize) {
	int i = 0;
	int maxSum = nums[0];
	int* dp = (int*)malloc(numsSize * sizeof(int));
	*dp = nums[0];
	for (i = 1; i < numsSize; i++)
	{
		int temp = *(dp + i - 1) + nums[i];
		if (temp > nums[i])
		{
			*(dp + i) = temp;
		}
		else
		{
			*(dp + i) = nums[i];
		}
		if (*(dp + i) > maxSum)
		{
			maxSum = *(dp + i);
		}
	}
	free(dp);
	return maxSum;
}

C++版

/*动态规划 O(n)*/
class Solution {
public:
	int maxSubArray(vector<int>& nums) {
		vector<int> dp(nums.size());
		int maxSub = nums[0];
		dp[0] = nums[0];
		for (int i = 1; i < nums.size(); i++)
		{
			dp[i] = max((dp[i - 1]) + nums[i], nums[i]); //子序列和与当前值,取大值
			maxSub = max(maxSub, dp[i]); //更新最大值标记
		}
		return maxSub;
	}
};

Python版

#动态规划
class Solution:
    def maxSubArray(self, nums: List[int]) -> int: #返回值int,参数nums类型为int
        dp = []
        maxFlag = nums[0]
        dp.append(nums[0])
        for i in range(1, len(nums)):
            dp.append(max(dp[i - 1] + nums[i], nums[i]))
            maxFlag = max(maxFlag, dp[i])
        return maxFlag

☞贪心策略版

C语言版

/*贪心策略  时间复杂度 O(n)*/
int maxSubArray(int* nums, int numsSize) {
	int i = 0;
	int maxSum = nums[0];
	int numSum = 0;
	for (i = 0; i < numsSize; i++)
	{
		numSum = numSum + nums[i];
		if (maxSum < numSum)
		{
			maxSum = numSum;
		}
		if (numSum < 0)
		{
			numSum = 0;
		}
	}
	return maxSum;
}

C++版

/*贪心算法   O(n)*/
class Solution {
public:
	int maxSubArray(vector<int>& nums) {
		int maxNum = nums[0];
		int subSum = 0;
		for (int i = 0; i < nums.size(); i++)
		{
			subSum = subSum + nums[i];
			if (subSum > maxNum)
			{
				maxNum = subSum; //如果累加和大于0就一直累加,并更新最大值
			}
			if (subSum < 0)
			{
				subSum = 0; //一旦累加和变成小于0,就抛弃这个负数,从0开始重新累加,保留原来的最大值
			}
		}
		return maxNum;
	}
};

Python版

#贪心
class Solution:
    def maxSubArray(self, nums: List[int]) -> int: #返回值int,参数nums类型为int
        subSum = 0
        maxSum = nums[0]
        for i in range(len(nums)):
            subSum = subSum + nums[i]
            maxSum = max(maxSum, subSum)
            if subSum < 0:
                subSum = 0
        return maxSum	

在这里插入图片描述
在这里插入图片描述


posted @ 2022-08-25 12:07  Mindtechnist  阅读(5)  评论(0编辑  收藏  举报  来源