【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)

相关文章
|
4天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
10 2
|
4天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
8 0
|
5天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
8 1
|
5天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
9 2
|
8天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
19 0
|
13天前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
15天前
|
存储 C++
【C++模板】模板实现通用的数组
【C++模板】模板实现通用的数组
|
20天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
34 1
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
28天前
【力扣】238. 除自身以外数组的乘积
【力扣】238. 除自身以外数组的乘积