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

贪心算法|53.最大子序和

力扣题目链接

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

这题的暴力解法很好理解,以上是贪心解法的代码。

贪心解法

贪心贪的是哪里呢?

如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。

这相当于是暴力解法中的不断调整最大子序和区间的起始位置

那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续和”呢?

区间的终止位置,其实就是如果 count 取到最大值了,及时记录下来了。例如如下代码:

if (count > result) result = count;

这样相当于是用 result 记录最大子序和区间和(变相的算是调整了终止位置)

如动画所示:

53.最大子序和

红色的起始位置就是贪心每次取 count 为正数的时候,开始一个区间的统计。

自己的思路:

贪心算法的关键代码在for循环里面

只有count是正数时才继续进行

当count小于0时,count=0,这里也是理解的关键

if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和

 

很好的理解咯,独自敲代码,没有出一点错误~ 

相关文章:

  • WinForm用微软打包工具打包
  • 外包干了25天,技术倒退明显
  • vue element动态添加删除数据div
  • Vue - 你知道Vue中key的工作原理吗
  • opencv如何寻找图片轮廓
  • LeetCode 19.删除链表的倒数第N个结点
  • 《青少年成长管理2024》028 “成长七要素之五:能力”1/5
  • Git - 如何重置或更改 Git SSH 密钥的密码?
  • OpenHarmony实战:CMake方式组织编译的库移植
  • MySQL - MySQL架构设计
  • Linux——用户管理,文件压缩命令
  • 思科数通设备命令大全
  • 1.k8s简介
  • NOI - OpenJudge - 2.5基本算法之搜索 - 1490:A Knight‘s Journey - 超详解析(含AC代码)
  • docker使用arthas基本教程
  • .pyc 想到的一些问题
  • [译]前端离线指南(上)
  • 10个确保微服务与容器安全的最佳实践
  • 345-反转字符串中的元音字母
  • const let
  • Cumulo 的 ClojureScript 模块已经成型
  • go语言学习初探(一)
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Quartz初级教程
  • React Transition Group -- Transition 组件
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • TCP拥塞控制
  • 订阅Forge Viewer所有的事件
  • 前端攻城师
  • 06-01 点餐小程序前台界面搭建
  • ionic入门之数据绑定显示-1
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)Nginx简介和安装教程
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)Linux——Linux常用指令
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转) ns2/nam与nam实现相关的文件
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .Net中间语言BeforeFieldInit
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法