题目:Given an array of integers, find the subarray with smallest sum. Return the
sum of the subarray. 翻译:给定一个整型数组,找到它的一个子数组,使得这个子数组的和是所有子组的和中最小的。

注意 The subarray should contain at least one integer.

样例 For [1, -1, -2, 1], return -3

思路: 当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。
如果当前得到的和是个正数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个正数将会增大接下来的和。
如果数组中没有负数,则其中最小的正数即为答案。

/*** * @author 风的流向* */
public class MinimumSubarray {/*** @param nums*            : a list of integers* @return: A integer indicate the sum of minimum subarray*/public int minSubArray(ArrayList<Integer> nums) {int sum = 0, min = 0, result = nums.get(0);for (int num : nums) {sum += num;// 子数组和if (sum > 0)    sum = 0;// 累加和为正数时舍弃if (sum < min)    min = sum;// 最小子数组和if (min >= 0 && num < result)    result = num;// 最小正数}return min == 0 ? result : min;// 没有负数时返回最小正数}
}

【附:开课吧算法讨论组参考答案】
提示:
典型的贪心算法问题,思路是从数组第一个数字开始进行累加,用一个int统计最小的和(minimum sum of sub array) - 初始值为INT_MAX,用一个int统计当前的和 - 初始值为0。
int minSum = INT_MAX;
int currentSum = 0;

然后开始遍历数组,对当前遍历到的数组元素进行累加,如果累加器currentSum得到的值小于minSum,则记录currentSum为minSum。
然后判断currentSum是否为>0,如果大于0,则可以认为,从此处往前的数字都可以抹掉(为什么-贪心策略),并将currentSum重置为0,重新计数。

通过对数组循环的遍历,最后得到的minSum即为题目所求的minSubArray。

参考代码:

#include <limits> class Solution { public: /** * @param nums: a list of integers * @return: A integer denote the sum of minimum subarray */ int minSubArray(vector<int> nums) { // write your code here int minSum = INT_MAX; int currentSum = 0; for (int i = 0; i < nums.size(); i++) { currentSum += nums[i]; if (currentSum < minSum) minSum = currentSum; if (currentSum > 0) currentSum = 0; } return minSum; }
}

数据结构与算法应用(五):Minimum Subarray相关推荐

  1. 数据结构和算法(五)--栈(Stack)

    数据结构和算法(五)–栈(Stack) 什么是栈 栈是一种特殊的线性表,只能在一端进行操作 往栈中添加元素,一般叫做push,入栈 往栈中移除元素,一般叫做pop,弹栈/出栈(只能移除栈顶元素) 栈遵 ...

  2. 数据结构与算法(五)排序算法篇

    排序算法篇 恭喜各位小伙伴来到最后一部分:排序算法篇,数据结构与算法的学习也接近尾声了,坚持就是胜利啊! 一个数组中的数据原本是凌乱的,但是由于需要,我们需要使其有序排列,要实现对数组进行排序我们之前 ...

  3. 从零开始学数据结构和算法:五面阿里拿下飞猪事业部offer,快来收藏!

    前言 面试前就有听说过字节比较考验算法,面试的时候果然是,还好自己刷题比较多,这也验证了一个说法,大家在面试字节等目前比较火的互联网公司,一定要记得多刷题,文末会有自己面试的时候准备好的面试题PDF文 ...

  4. Java数据结构和算法(五)——队列

    前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构--栈,本篇博客我们介绍另外一个这样的工具--队列.栈是后进先出,而队列刚好相反,是先进先出. 回到顶部 ...

  5. 【数据结构与算法】五、哈希表和链表

    前言: 大家好,我是春风 今天继续刷左神的算法视频,前面刷完了入门的查找和排序算法,也对排序算法做了一些总结. 现在开始刷结构部分,第一个结构是哈希表,然后是链表.哈希表的应用在Java中有现成的ma ...

  6. 数据结构与算法(五)图

    基础知识: 一.图的存储 1.十字链表 十字链表是邻接表和逆邻接表的结合,能够由firstinarc出发得到vi的整个邻接表,由firstoutarc出发得到vi的整个逆邻接表.构建的方法就是每读入一 ...

  7. 【离散数学中的数据结构与算法】五 排列与组合一

    在leetcode刷题过程中,遇到过很多关于排列组合的问题.弄清楚排列组合的相关原理,是非常有用处的. 文章目录 1 问题 2 排列-有序选取 2.1 重复选取-可重排列 2.2 不重复选取-排列 2 ...

  8. python listnode.val_Python 学习 -- 数据结构与算法 (五)

    链表代码 理解指针或引用的含义 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量. 警惕指针丢失和内存 ...

  9. 【离散数学中的数据结构与算法】六 排列与组合二

    接着上一篇学习:[离散数学中的数据结构与算法]五 排列与组合一 上一篇文章主要学习了可重复选取的可重排列和不可重复选取的排列.他们都是在n个不同的对象中选取. 今天我们俩学习的是,当这个n个对象中有相 ...

  10. 数据结构与算法教程,让数据结构不再难懂,让算法不再难写

    据结构与算法不分家 数据结构包括数据对象集以及它们在计算机中的组织方式,即它们的逻辑结构和物理存储结构,一般我们可以认为数据结构指的是一组数据的存储结构. 算法就是操作数据的方法,即如何操作数据效率更 ...

最新文章

  1. 如何解决Git中的合并冲突
  2. 发现“郝茵晴”:屌丝们的社会性传播实验
  3. 买卖股票的最佳时机||
  4. php.ini权限,php开启与关闭错误提示适用于没有修改php.ini的权限_PHP
  5. 端午小长假--前端基础学起来02与浏览器交互,表单标签
  6. Android中dp与px互转的方法
  7. 项目中的那些事---下载pdf文件
  8. 工作172:自己工作开始封装的一个小组件
  9. openOCD安装 极简教程
  10. 微型计算机突然断电什么信息全部都是,微型计算机的硬件组成阶段作业(函授2014春).doc...
  11. Windows Vista for Developers——第二部分:深入分析任务对话框
  12. 你的个人信息真的被偷走了?——那些过分“精准”的广告推荐的背后
  13. web开发中的计算机网络知识——应用层
  14. Yii1.0框架整合融云解析(一)
  15. python 小技巧之获取固定下面包含的某种类型文件的个数
  16. 2021 年“认证杯”数学中国数学建模网络挑战赛 B题
  17. PR菜鸟教程:如何剪切掉其中不需要的片段
  18. 100047. 【NOIP2017提高A组模拟7.14】基因变异
  19. 基于java+ssm+mysql的医院管理系统
  20. 用12星座看人的性格准吗?

热门文章

  1. DevOps前沿技术培训课程大纲
  2. 线粒体和叶绿体的基因组特点_线粒体和叶绿体基因组的组织及表达解析.ppt
  3. 安装Linux镜像文件,通过iso镜像文件硬盘安装Liunx (转载)
  4. 2019 谷歌dat.GUI组件对中文的支持
  5. Matlab R2017a启动时初始化过程时间太长解决办法
  6. 拼多多,是漏洞的损失?还是营销的手段?
  7. 强化学习论文分析3---蜂窝网络联合频谱和功率分配的深度强化学习--《Deep Reinforcement Learning for ......》
  8. android系统wifi控制风扇,可手机APP控制的机箱风扇,光污染新玩法
  9. 对象存储oss挂载工具ossfs的使用
  10. VScode markdown自动生成目录