zoukankan      html  css  js  c++  java
  • 剑指offer三十之连续子数组的最大和

    一、题目

      HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)

    二、思路

    情况一:数组中至少包含一个正数,

      这种情况下,将数组元素进行累加,如果累加和出现小于0的情况,则和最大的子序列肯定不可能包含前面的元素,这时将累加和置0,从下个元素重新开始累加,最后返回累加和即可。

    情况二:数组中元素都为负数,则最大子数组和即为该数组里最大的那个元数的值。

    三、代码

    public class Solution {
        public int FindGreatestSumOfSubArray(int[] array) {
    
            int maxSum = 0;
            int curSum = 0;
            int maxNum = array[0];
    
            for (int i = 0; i < array.length; i++) {
    
                //情况一:数组中至少包含一个正数
                curSum += array[i];
    
                if (curSum > maxSum) {
                    maxSum = curSum;
                }
    
                //如果累加和出现小于0的情况,则和最大的子序列肯定不可能包含前面的元素,这时将累加和置0,从下个元素重新开始累加
    
                if (curSum < 0) {
                    curSum = 0;
                }
    
                //情况二:数组中元素都为负数,最大子数组的和即为该数组里最大的那个元素
                if (array[i] > maxNum) {
                    maxNum = array[i];//数组中的最大值
                }
            }
    
            return maxNum > 0 ? maxSum : maxNum;
        }
    }
    View Code

    ----------------------------------------------------

    参考链接:

    https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

  • 相关阅读:
    Android周学习Step By Step(6)Android的数据库SQLite
    Android周学习Step By Step(2)HelloWorld
    解决方案(.sln)文件
    浅谈测试(1)单元测试
    批量上传功能的实现
    分页控件AspNetPager的用法
    .net下验证码的简单实现
    window.alert重写实现友好的对话框(支持IE)
    网页上自定义运行和测试HTML脚本
    数据库行转列的sql语句(zt)
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7652695.html
Copyright © 2011-2022 走看看