【LeetCode每日一题C++版】53. 最大子数组和【简单】

简介: 【LeetCode每日一题C++版】53. 最大子数组和【简单】

53. 最大子数组和【简单】


相同题目:剑指 Offer 42. 连续子数组的最大和



你一定会想计算每一个索引开头的最大子序和吧!


那就写出第一种方法:


思路一:双for循环暴力破解:计算从每一个索引开始的最大子序和


  • 第一个for遍历每个子序和开头的索引


  • 第二个for记录遍历到的元素,在里面收集更新结果


class Solution {
public:
    int maxSubArray(vector<int>& nums) {    
    int res = INT_MIN;
        for(int i = 0; i < nums.size(); ++i){
            int temp = 0;
            for(int j = i; j < nums.size(); ++j){
                temp += nums[j];      //当前的累积和
                res = max(res, temp); //更新最大值
            }
        }
        return res;
    }
};


结果就不用我说了吧



哪还有什么方法呢?


我们可以随着遍历生成一个数组,这个数组记录当前的子序和最大值


思路二:动态规划


思路可查看此人的PPT:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-cshi-xian-si-chong-jie-fa-bao-li-f/


class Solution {
public:
    int maxSubArray(vector<int>& nums) {    
    //先替换元素  更新数组
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i - 1] > 0) {             //如果前一个元素>0   后一个元素改为两者之和
                nums[i] = nums[i - 1] + nums[i];  //新生成的记录当前的子序和最大值的数组
            }
        }
    //再遍历查找最大值
        int res = nums[0];
        for (int i : nums) {
            res = max(res, i);
        }
        return res;
    }
};


我们可以对两个并行for循环进行优化,只用一个for循环解决


class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i - 1] > 0) {
                nums[i] = nums[i - 1] + nums[i];
            }
            if (nums[i] > res) {
                res = nums[i];
            }
        }
        return res;
    }
};


接着优化缩短代码,美化程序


class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            nums[i] = max(0 + nums[i], nums[i - 1] + nums[i]);  //主要是这句代码
            res = max(res, nums[i]);                        //动态记录最大子序和
        }
        return res;
    }
};


时间复杂度:O(n)


空间复杂度:O(1)

目录
相关文章
|
5月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
205 1
|
5月前
|
Java C++
力扣第一道困难题《3. 无重复字符的最长子串》,c++
首先我们看到这个题是肯定有一种暴力的硬解思路的,那就是将两个vector直接链接起来,然后再排序后,直接返回中间值,这个方法实现起来还是非常容易的,
102 0
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
298 5
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
131 0
|
10月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
184 5
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
114 4
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
111 0
Leetcode第三十三题(搜索旋转排序数组)
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
217 0

热门文章

最新文章