当前位置: 首页 > news >正文

LeetCode 热门100题-最大子数组和-错题

题目描述:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组

是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

实现逻辑:

与上一题相似,都是求和为k的子数组,只不过上一题是k为一个确定值,而此题是求和为最大值。

那可以先求出数列{Sn},再从Sn中找到一个最小值min,和在其右侧的某个最大数max,使得二者的差值最小。这又与后续一个贪心算法的题很相似,找到股票进账最多的买入天数和卖出天数。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> Sn; // 存储前缀和
        int current_sum = 0;
        Sn.push_back(current_sum); // 初始前缀和为0
        
        // 计算所有前缀和并存入 Sn
        for (const int& num : nums) {
            current_sum += num;
            Sn.push_back(current_sum);
        }
        
        int Max = INT_MIN; // 初始化为最小可能值,以处理所有元素都是负数的情况
        int min_prefix_sum = 0; // 用于跟踪到目前为止遇到的最小前缀和
        
        // 遍历 Sn 来找到最大子数组和
        for (int i = 1; i < Sn.size(); ++i) { // 从 1 开始,因为 Sn[0] 是初始前缀和 0
            // 更新最大子数组和
            Max = max(Max, Sn[i] - min_prefix_sum);
            
            // 更新最小前缀和
            min_prefix_sum = min(min_prefix_sum, Sn[i]);
        }
        
        return Max;
    }
};

 那么这个代码就是基于这样的一个逻辑去实现的。当然还有更高效的算法:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        // 初始化当前子数组的和和最大子数组和
        int current_sum = nums[0];  // 当前子数组和
        int max_sum = nums[0];      // 最大子数组和

        // 从第二个元素开始遍历
        for (int i = 1; i < nums.size(); ++i) {
            // 判断是否要从当前元素开始新的子数组,还是继续累加当前子数组
            current_sum = max(nums[i], current_sum + nums[i]);
            // 更新最大子数组和
            max_sum = max(max_sum, current_sum);
        }

        return max_sum;
    }
};

 错题记录:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int maxSum=nums[0];
        int currentSum=nums[0];
        for(int i=1;i<nums.size();i++)   //注意  一开始给的i=0;
        {
            currentSum = max(nums[i],currentSum+nums[i]);
            maxSum = max(maxSum,currentSum);
        }
        return maxSum;
    }
};

相关文章:

  • 初始JavaEE篇 —— Spring Web MVC入门(下)
  • 深入解析与解决 Oracle 报错:ORA-29275 部分多字节字符20250213
  • 阿里云大文件ossutil工具进行上传下载,该工具支持断点续传
  • Spring 框架——@Async 注解
  • 【R语言】回归分析与判别分析
  • Jenkins介绍
  • set_intersection set_union set_difference set_symmetric_difference
  • nginx服务器
  • 在Linux系统下修改Docker的默认存储路径
  • CAS单点登录(第7版)1.首页
  • Windows环境安装Kafka(集群版)
  • LVS 负载均衡集群(NAT模式)
  • newgrp docker需要每次刷新问题
  • 高中信息技术课程平台
  • 23. AI-大语言模型
  • springboot-自定义注解
  • 计算机毕业设计——Springboot的疫情网课管理系统
  • 常见的 Web 攻击方式有哪些,如何防御?
  • 设计模式面试题
  • 网络共享基于什么原理,为什么MAC可以编辑局域网的windows系统文件?
  • “80后”北大硕士罗婕履新甘肃宁县县委常委、组织部部长
  • 山东茌平民企巨头实控人省外再出手:斥资16亿拿下山西一宗探矿权
  • 广东缉捕1名象牙走私潜逃非洲“红通”逃犯
  • 民间打拐志愿者上官正义遭人身安全威胁,杭州公安:已立案
  • 体坛联播|热刺追平单赛季输球纪录,世俱杯或创收20亿美元
  • 土耳其、美国、乌克兰三边会议开始