动态规划:面试题42. 连续子数组的最大和

面试题42. 连续子数组的最大和

题目要求:

解题思路:

1. 定义子问题:

  dp[i] 为下标以 num[i] 结尾的数组字段 元素最大最短和,i表示子段到当前i位置 i;

2. 寻找关系式:

  只有一个元素:dp[0] = num[0];

  两个元素:dp[i] 为num[0], num[1], num[0]+num[1];

  三个元素时:考虑前三个元素,如何求其最?大?子段和?还是分为两种情况讨论,第三个元素在最后的字串串内吗?
    若第三个元素也包含在最后的字串串内,则dp[2] = max(dp[1]+num[2] , num[2]) ;

  所以转移方程为:dp[i] = max(dp[i-1] + num[i],  num[i] ) ;

3. 初始值:

  dp[0] = nums[0];
  dp[1] = max(dp[0]+num[1] , num[1]) ;

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums)
 4     {
 5         int len = nums.size();
 6         if (len < 1)
 7         {
 8             return 0;
 9         }
10         int* dp = new int[len];
11         //int[] dp = new int[len]  //不支持
12         dp[0] = nums[0];
13         int max = dp[0];
14         for (int i=1; i<len; i++)
15         {
16             dp[i] = std::max(dp[i-1] + nums[i],  nums[i]);
17             if (dp[i] > max)
18             {
19                 max = dp[i];
20             }
21         }
22         return max;
23     }
24 };

优化:在原数组的基础上进行更改。

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums)
 4     {
 5         int len = nums.size();
 6         if (len < 1)
 7         {
 8             return 0;
 9         }
10         //int* dp = new int[len];
11         //int[] dp = new int[len]  //不支持
12         //dp[0] = nums[0];
13         int max = nums[0];
14         for (int i=1; i<len; i++)
15         {
16             //dp[i] = std::max(dp[i-1] + nums[i],  nums[i]);
17             if (nums[i-1] > 0)
18             {
19                 nums[i] += nums[i-1];
20             }
21             if (nums[i] > max)
22             {
23                 max = nums[i];
24             }
25         }
26
27         return max;
28     }
29 };

原文地址:https://www.cnblogs.com/Tavi/p/12640888.html

时间: 2024-10-25 08:23:18

动态规划:面试题42. 连续子数组的最大和的相关文章

【剑指offer】面试题 42. 连续子数组的最大和

面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 注意: 要求时间复杂度为 O(n). Java 实现 public class Solution { public int FindGreatestSumOfSubArray(int[]

剑指OFFER----面试题42. 连续子数组的最大和

链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/submissions/ 代码: class Solution { public: int maxSubArray(vector<int>& nums) { int res = INT_MIN, s = 0; for (auto x: nums) { if (s < 0) s = 0; s += x; res = max(res, s);

剑指offer面试题31连续子数组的最大和

一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 二.解题思路 求连续子数组的最大和,首先想的到最笨的方法就是暴力解决,两个for循环,遍历数组找到和最大的子

面试题31 连续子数组的最大和

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 1 class Solution { 2 public: 3 vector<int> v; 4 int Fin

面试题:连续子数组的最大和

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? class Solution { public: int FindGreatestSumOfSubArray(vector

剑指Offer面试题:28.连续子数组的最大和

一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18. 这个题目在我去年参加校园招聘时,某公司的二面采用了机试,而题目刚好就是这道题.一般看到这道题目就会想到枚举出数组的所有子数组并求出它们的和.一个长度为n的数组,总共有n(n+1)/2个子数组.计算

剑指Offer对答如流系列 - 连续子数组的最大和

面试题42:连续子数组的最大和 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整/数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 问题分析 输入数组{1.-2.10.-4.7.2.-5} 很容易看出从第一个数字开始累加,若走到某一个数字时,前面的累加和为负数,说明不能继续累加了.比如1 和 -2累加后值为-1,后面的数字加上-1反而变小了,应舍弃.要从接下来的数字重新开始累加.注意在累加过程中,将每次累加和的最大值记录下来,遍历完成后,返回该数字

连续子数组的最大和-剑指Offer

连续子数组的最大和 题目描述 输入一个整数数组,数组里有整数也有负数.数组中一个或连续的多个整数组成一个数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路 我们可以举例分析数组的规律,用一个变量来存储最大值,另一个变量存储当前的和,若当前和为负值,则后面加的和都会比当前的小,所以当为负值时把当前的和设置为0重新开始计算 我们也可以通过动态规划的方法来解决这个问题 代码 public class Solution { public int FindGreatestSumOfSubArr

连续子数组的最大和问题

参考自:求连续子数组的最大和 求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18. 思路 一.暴力求法 计算每一个子数组的和,然后求最大值,复杂度O(n3).不推荐,代码就不写了. 二. 动态规划 设sum[i]为以第i个