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

简介: LeetCode 53. 最大子数组和 (动态规划+贪心——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;
    }
  }

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 


相关文章
|
4月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
106 4
|
3月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
5月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
393 0
|
3月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
58 1
|
3月前
|
存储 人工智能 算法
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
【算法——动态规划】蓝桥ALGO-1007 印章(C/C++)
|
3月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
79 0
|
3月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
4月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
WK
|
4月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
108 1
|
5月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
38 2