• 剑指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

  • 相关阅读:
    FusionMap 检测融合基因
    嵌合体序列
    seqtk 的安装和使用
    cutadapt 的安装与使用
    C语言简单选择排序
    C语言冒泡排序
    Java实现的各种排序算法(包括冒泡,快排等)
    C++实现顺序计算输入表达式的值
    java多线程有几种实现方法?线程之间如何同步
    java中==与equal()方法的区别
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7652695.html
Copyright © 2020-2023  润新知