首页 > 其他分享 >连续子数组的最大和【剑指Offer】

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

时间:2023-03-06 23:46:36浏览次数:36  
标签:nums int max Offer 连续 数组 ans dp

连续子数组的最大和

输入一个 非空 整型数组,数组里的数可能为正,也可能为负。

数组中一个或连续的多个整数组成一个子数组。

求所有子数组的和的最大值。

要求时间复杂度为 O(n)。

数据范围
数组长度 [1,1000]。
数组内元素取值范围 [−200,200]。

样例
输入:[1, -2, 3, 10, -4, 7, 2, -5]

输出:18

思路1贪心

贪心策略:

  1. 如果和要变小,那么先取一遍max
  2. 如果临时和t小于0(此时前面的方案已经不可取,对最大和的贡献是负的)那么将t清0

代码1

点击查看代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        bool f = 0;
        int maxn = -300;
        for(int i = 0; i < nums.size(); i ++ ){
            if(nums[i] >= 0)f = 1;	
            maxn = max(maxn,nums[i]);
        }
        int t = 0;
        int ans = 0;
        if(f){
            for(int i = 0; i < nums.size(); i ++ ){
                if(nums[i] < 0)ans = max(ans,t);
                t += nums[i];
                if(t < 0)t = 0;
            }
            ans = max(ans,t);
            return ans;
        }
        else{
            return maxn;
			.//如果全部都是负数,那么最大得到数即为最大和
        }
        
    }
};

思路2dp

定义\(dp[i]\)为前\(i\)项的最大和.\(dp[1]=nums[1]\)
状态转移方程为\(dp[i] = max(dp[i-1]+nums[i],nums[i])\)

代码2

点击查看代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int dp[nums.size()];
        dp[0] = nums[0];
        int ans = nums[0];
        for(int i = 1; i < nums.size(); i ++ ){
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
            ans = max(dp[i],ans);
        }
        return ans;
    }
};

代码3滚动数组优化

由于dp数组只用到了i-1,因此可以考虑用滚动数组进行优化

点击查看代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int a = nums[0],ans = nums[0];
        for(auto x:nums){
            a = max(a + x, x);
            ans = max(a,ans);
        }
        return ans;
    }
};

标签:nums,int,max,Offer,连续,数组,ans,dp
From: https://www.cnblogs.com/J-12045/p/17185921.html

相关文章

  • 返回一个整数数组中最大子数组的和
    1.题目:返回一个整数数组中最大数组的和2.要求:(1)输入一个整数数组,数组里有正数也有负数。(2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和......
  • 课堂练习:最大子数组
    参考了一篇学长的博客,受益匪浅,通过不断累加,当和变成负数归零从一个数开始加,之前的结果保存到max,每一次的结果都跟max对比,保证只要不低于0的负数都可以加进来1pu......
  • 为什么单个测试结果正确,连续测试结果异常?
    单个跑正常,多个跑异常;因为上一个测试的输入内容还没有被读完就goto/break/continue了。这种情况,需要读取上一个输入中剩余的部分。例子:std::getline(std::cin,s);//......
  • 求数组中的最大子数组的和--相关测试
    测试一:在普通的数组里面求最大子数组的和首先给出一个普通数组的定义,然后循环遍历,为数组的n个元素赋值;然后再根据a[i]+a[i-1]>a[i]的条件是否成立,来进行加和运算,然后赋值......
  • 209. 长度最小的子数组 (Medium)
    问题描述209.长度最小的子数组(Medium)给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsₗ,num......
  • 剑指 Offer25. 合并两个排序的链表
    题目描述   解法一迭代思路:当l1和l2都不是空链表时,判断l1和l2哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将......
  • 求一个数组中所有子数组和的最大值
    importdao.StuMapper;importorg.junit.Test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlAppl......
  • js一维数组转二维数组
    利用数组的splice方法进行转换1.封装函数  2.使用方法 ......
  • 剑指 Offer22.链表中倒数第k个节点
    题目描述   解法一顺序查找思路:链表长度为n,则链表倒数第k个节点是第n-k个节点classSolution{public:ListNode*getKthFromEnd(ListNode*head,intk)......
  • 算法与数据结构——整数数组求最大子数组
    题目:输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。代码:......