文章目录
- 一【题目类别】
- 二【题目难度】
- 三【题目编号】
- 四【题目描述】
- 五【题目示例】
- 六【解题思路】
- 七【题目提示】
- 八【题目注意】
- 九【时间频度】
- 十【代码实现】
- 十一【提交结果】
一【题目类别】
- 动态规划
二【题目难度】
- 简单
三【题目编号】
- 剑指 Offer 42.连续子数组的最大和
四【题目描述】
- 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
- 要求时间复杂度为O(n)。
五【题目示例】
- 示例1:
- 输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
- 输出: 6
- 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
六【解题思路】
- 利用动态规划的思想,对于数组每一位的数字,只有两种情况:
- 将此元素与之前的子数组组合在一起,形成一个新的子数组
- 此元素自己单独作为一个子数组或者子数组的开始
- 我们只需要在这两种情况里面选择最大的那个保存为截止到当前位置的最大值
- 然后不停的更新最大值
- 最后返回结果即可
七【题目提示】
- 1 < = a r r . l e n g t h < = 1 0 5 1 <= arr.length <= 10^5 1<=arr.length<=105
- − 100 < = a r r [ i ] < = 100 -100 <= arr[i] <= 100 −100<=arr[i]<=100
八【题目注意】
- 本题与主站 53 题相同:https://leetcode-cn.com/problems/maximum-subarray/
九【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为数组大小
- 空间复杂度: O ( 1 ) O(1) O(1)
十【代码实现】
- Java语言版
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for(int i = 1;i<nums.length;i++){
dp[i] = Math.max(dp[i - 1] + nums[i],nums[i]);
max = Math.max(dp[i],max);
}
return max;
}
}
- C语言版
int maxSubArray(int* nums, int numsSize)
{
int* dp = (int*)malloc(sizeof(int) * numsSize);
dp[0] = nums[0];
int max = dp[0];
for(int i = 1;i<numsSize;i++)
{
dp[i] = fmax(dp[i -1] + nums[i],nums[i]);
max = fmax(dp[i],max);
}
return max;
}
- Python版
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
dp = [0] * len(nums)
dp[0] = nums[0]
res = dp[0]
for i in range(1,len(nums)):
dp[i] = max(dp[i - 1] + nums[i],nums[i])
res = max(res,dp[i])
return res
十一【提交结果】
-
Java语言版
-
C语言版
-
Python语言版