在《算法导论》中举了买股票和割铁棒的例子来说明动态规划和贪心算法的主体思想。

贪心算法:总是做出在当前看来最好的情况。(不是整体最优的)

1. 问题及答案


先抛出一个问题,类似于《算法导论》中的股票问题。

1.1 问题

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
简单的一句话概括,就是找一个数组中拥有最大和的子数组,返回其和。

答案(不唯一)只有6行,可以说是非常简洁,且便于理解了。

1.2 一种答案

/* *@lucastan */
int maxSubArray(vector<int> &nums) {int ans = nums[0], i, sum = 0;for(i = 0; i < nums.size(); i++){sum += nums[i];ans = max(sum, ans);sum = max(sum, 0);}return ans;
}复制代码

2. 解题思路


读完问题,我们立刻就能想到的是从头开始加,总能枚举出来一个。

这个想法可以说是非常朴实了,但是……我们还是继续思考吧,第二反应就是贪心算法了(如果你能想到动态规划的思想,也不错啊,可以类似的求解)。

首先我们要说,贪心算法的简单定义是什么?(答案是白色字体)

总是找到一个在当前看来最优的解。

然后,我们现在要求的是什么?

数组中拥有最大和的子数组。

这样一来,目标就明确了,我们肯定是需要遍历数组的,不然怎么能确定我们考虑到了数组中所有元素呢?

明确了目标,我们结合贪心算法的定义,提出下一个问题,我们怎么确定现在的子数组元素的和到目前为止是最大的呢?

与在添加了下一个元素之前的数组进行比较。

那万一我们加到数组的某一个位置的时候,出现了和为负的情况……

笨啊,一旦加到某个元素出现和为负的情况,我们就应该舍弃前面的所有元素,然后在下一个元素处重新开始求和。如果等于零,那么我们就要从这个元素开始重新求和。
另外,不要钻最大子数组在中间的这一种情况的牛角尖,除非在计算时数组前面的元素和小于等于零,否则我们在这个代码里,永远会得到[0...x](x代表子数组的最后一个元素序号,[0...x]难道不是他的子数组吗?就算我们最后得到数组本身,他也是该数组的子数组)。

3. 一点想法


文章看到这里,可能就有人发现了,这个问题并不是真的应用了贪心算法,我们只是借来了贪心算法一点点的思想,然后就得到了问题的解答。

(完整的贪心算法思想在这里是不能应用的,如果题目不要求子数组连续,那么倒是可以完整的应用贪心算法思想,但这样一来问题也就失去了意义。)

看了标题和开头的一点点胡言乱语,你是不是真的以为我要讲贪心算法了,哼,天真。

装完逼就跑,真刺激

求最大子数组(贪心算法)相关推荐

  1. 求最大子数组和(数据结构和算法C++)

    求最大子数组和 题目 纠错1: 修改1: 动态规划1: 动态规划的进一步优化: 贪心法1: 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大 ...

  2. 结对开发——环形一维数组求最大子数组和

    题目:返回一个整数数组中最大子数组的和. 要求: (1)输入一个整形数组,数组里有正数也有负数. (2)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (3)如果数组A[0]--A[ ...

  3. 结对开发 随机产生数组并求最大子数组的和

    一.题目 返回一个整数数组中最大子数组的和. 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O( ...

  4. 环形数组求最大子数组之和

    环形数组求最大子数组之和: 实验要求: 随机产生一个整形数组,假设首尾相连为环形,求其相连的字数组的和,并输出子数组的元素. 设计思路: 因为是环形,所以要考虑自设的头尾的情况,在此分为两大类考虑,一 ...

  5. java求最大子数组 (分治算法)

    当一个数组有负数时,最大子数组才会有意义. package shu.quan.demo;/*** 求最大子串的值,并求出脚标.*/ public class MaxSubsequence {stati ...

  6. [Leedcode][JAVA][第56题][合并区间][数组][贪心算法]

    [问题描述]56.合并区间 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18] ...

  7. 求数列极差(贪心算法)

    题目描述] 在黑板上写了N个正整数作成的一个数列,进行如下操作:每一次擦去其中的两个数a和b,然后在数列中加入一个数a×b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的 ...

  8. c语言分治法求数组最大值,使用分治法求最大子数组的下标。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include int max(int a[],int left,int right); int maxcross(int a[],int left,i ...

  9. 分治法求数组最大值 c语言,使用分治法求最大子数组的下标。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include int max(int a[],int left,int right); int maxcross(int a[],int left,i ...

最新文章

  1. Linux环境编译安装Mysql以及补装innodb引擎方法
  2. oracle 游标中抛出异常的处理方式
  3. 视频压缩编码 gop(Group of Pictures)(I帧间隔)的概念、IDR、I帧(关键帧,intra picture)、P帧、B帧、帧内压缩、帧间压缩、pts(显示时间)、dts(解码时间)
  4. mpvue 微信小程序_使用Vue.js开发微信小程序:开源框架mpvue解析
  5. Android构建流程——篇五
  6. 江翰服务器保护系统(JH-Data Backup server)
  7. Python ' ~ ' (取反) 操作符解释
  8. 位图bitmap应用
  9. VB6.0中创建和使用文本资源文件
  10. SqlServer和Oralce保留几位小数以及当末尾小数为0也显示
  11. 【卡号识别】基于matlab CNN银行卡数字识别【含Matlab源码 030期】
  12. 苹果录屏功能没有声音_安卓最高清的录屏软件,没有之一,已解锁VIP功能!
  13. 嵌入式面试—项目篇(二)全国大学生智能汽车竞赛(团队项目)
  14. 如何选择和阅读科技论文
  15. js获取当前指定的前几天的日期(如当前时间的前七天的日期)
  16. 东秦OJ_1841: 超级密码
  17. 中兴Blade V2021 5G 刷机root教程 ZTE 8012N root 线刷包下载TWRP 刷入
  18. 计算机网络题库---第三章数据链路层
  19. flash制作水波,根据鼠标点击产生效果
  20. vue 生命周期详解 (附代码)

热门文章

  1. c++突破网关屏蔽_通过API网关实现微服务管控-限流,熔断和降级
  2. mysql事件类型_MySQL binlog中的事件类型
  3. 20200308: 生成每种字符都是奇数个的字符串灯泡开关 III(leetcode5352-5353)
  4. jquery post java对象_jquery $.post()返回数据
  5. 计算机对身体有哪些危害,经常玩电脑的危害 经常玩电脑对身体有哪些伤害
  6. python缩进问题idle_Python IDLE中的缩进问题
  7. php常用编码,简介常见的编码方式
  8. SpringBoot实战(三):整合Mybatis配置多数据源
  9. MIT脑洞研究!只听6秒语音,就知道你长什么样,效果好得不敢信
  10. 不劳烦苹果了!现在,FBI让嫌疑人抬头刷脸就能解锁iPhone