笔试题66. LeetCode OJ (53)
来源:互联网 发布:编程教师培训 编辑:程序博客网 时间:2024/06/06 02:00
此题是给定一个数组,找出数组中连续位置(一个区间)中所有数的和并且该和是所有区间中最大的。这个题看起来很难的样子,但是我们仔细想想的话,它的解法挺简单的!
主要思路是使用两个临时值,cursum(用来保存当前和),maxsum(用于保存最大和),方法是。从头到尾依次相加各个数,若当前和cursum > maxsum的话,那么将cursum的值赋给maxsum;若cursum < 0 的话,说明之前的区间最大和已经找出来了且保存在maxsum中了(这一点需要想清楚),这时候应该将cursum的值赋为0,从下一个位置开始找接下来的区间中的最大和,并依此和maxsum比较,知道遍历到最后,maxsum中保存的就是整个数组的子数组中的最大和。
这个题还有一点需要注意,那就是若数组中全部是负数的话,那么我们返回最大的负数即可,我们可以提前判断是否全部是负数,并用一个临时值保存它,最后若真是全负数的话,那么我们直接返回最大负数。代码如下:
class Solution {public:int maxSubArray(vector<int>& nums){/*查找连续的子数组,使其和最大*/int len = nums.size();if (len == 0){return 0;}else if (len == 1){return nums[0];}size_t pos = 0; //下标int cursum = 0; //保存最大和int maxsum = 0; //当前和 //除去开头的负数,并且找到其中的最大的负数,若数组全为负数就要返回该值int max = nums[0]; //数组最为负数,返回最大负数while (pos < len && nums[pos] < 0){if (nums[pos] > max){max = nums[pos];}++pos;}if (pos == len){ //全为负数...return max;}//存在正数while (pos < len){cursum += nums[pos];if (cursum > maxsum){maxsum = cursum;}else if (cursum < 0){ //当前和小于0,直接从下一个位置开始计算cursum = 0;}++pos;}return maxsum;}};
最后的结果如下:
1 0
- 笔试题66. LeetCode OJ (53)
- 笔试题14. LeetCode OJ (1)
- 笔试题15. LeetCode OJ (2)
- 笔试题16. LeetCode OJ (3)
- 笔试题17. LeetCode OJ (4)
- 笔试题18. LeetCode OJ (7)
- 笔试题19. LeetCode OJ (5)
- 笔试题20. LeetCode OJ (6)
- 笔试题21 . LeetCode OJ (8)
- 笔试题22. LeetCode OJ (9)
- 笔试题23. LeetCode OJ (10)
- 笔试题24. LeetCode OJ (11)
- 笔试题25. LeetCode OJ (12)
- 笔试题26. LeetCode OJ (13)
- 笔试题27. LeetCode OJ (14)
- 笔试题28. LeetCode OJ (15)
- 笔试题29. LeetCode OJ (16)
- 笔试题30. LeetCode OJ (17)
- Kafka入门教程
- workerman和thinkphp完美结合使用
- 有关oracle11g中scott用户被锁的解锁
- include 布局android:layout_below属性无法使用
- 正则表达式【项目中碰到使用的】
- 笔试题66. LeetCode OJ (53)
- ASE :Space available in segment 'logsegment' has fallen critically low in database
- 灵活运用ParameterSetName于多种使用场景
- python(十三)正则表达式
- 平台搭建1:Virtualbox虚拟机下安装ubuntu12.04以及共享文件夹的设置
- sql in '1,2' 转换成int
- Spring3.2.11与Quartz2.2.1整合时内存泄漏问题解决
- c++ byte与int
- Ubuntu 14.04+cuda7.5+torch+tensorflow+remastersys