zoukankan      html  css  js  c++  java
  • 剑指offer面试题31连续子数组的最大和

    一、题目描述

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

    二、解题思路

      求连续子数组的最大和,首先想的到最笨的方法就是暴力解决,两个for循环,遍历数组找到和最大的子数组。示例代码:

    /*
     * 连续子数组的最大和
     */
    public class Solution_31
    {
        public static void main(String[] args)
        {
            System.out.println(FindGreatestSumOfSubArray(new int[]{ -2, -8, -1, -5, -9 }));
        }
        public static int FindGreatestSumOfSubArray(int[] array)
        {
            if(array==null||array.length<=0)
                return 0;
            int maxSumOfSubArray = Integer.MIN_VALUE;
            for (int i = 0; i < array.length; i++)
            {
                int sum = array[i];
                if (sum > maxSumOfSubArray)
                {
                    maxSumOfSubArray = sum;
                }
                for (int j = i + 1; j < array.length; j++)
                {
                    if (sum + array[j] > maxSumOfSubArray)
                    {
                        maxSumOfSubArray = sum + array[j];
                    }
                    sum = sum + array[j];
                }
            }
            return maxSumOfSubArray;
        }
    }

      还有一种方法是,扫描一遍数组,并设置一个变量,保存已经扫描过的sum值,每扫描一个数,如果sum<0,则加上这个数后一定比当前这个数小,所以让sum等于当前这个数,如果sum>=0,则让sum=sum+当前这个数。扫描的过程还有比较Max和sum的值,取较大值。示例代码如下:

    public class Solution 
    {
        public int FindGreatestSumOfSubArray(int[] array)
       {
         if(array==null||array.length<=0)
                return 0;
            int sum = array[0];
            int maxSumOfSubArray = sum;
            for (int i = 1; i < array.length; i++)
            {
                if (sum >=0)
                {
                    sum=sum+array[i];
                }
                else
                    sum=array[i];
                if(sum>maxSumOfSubArray)
                    maxSumOfSubArray=sum;
            }
            return maxSumOfSubArray;
        }
    }

      最后,还有一种经典的动态规划算法(跟第二种方法类似),我们要找到状态转移方程:

      假设f(j)表示从是s[0]到s[j]最大和,则f(j)=max(s[j],f(j-1)+s[j])。示例代码如下:

    public static int FindGreatestSumOfSubArray3(int[] array)
        {
            if(array==null||array.length<=0)
                return 0;
            int maxSumOfSubArray = Integer.MIN_VALUE;
            int sum=0;
            for (int i = 0; i < array.length; i++)
            {
                sum=Math.max(array[i], array[i]+sum);
                maxSumOfSubArray=Math.max(maxSumOfSubArray,sum);
            }
            return maxSumOfSubArray;
        }
  • 相关阅读:
    Python学习系列之类与对象(二十三)
    面向过程和面向对象的异同点
    js 数值精确运算使用math.js
    js实现复制 、剪切功能-clipboard.min.js 示例
    css div嵌套层中button的margin-top不起作用解决方法
    IPhone中H5页面用on绑定click无效的解决方法
    This is a good start.
    element之input输入搜索联想框
    vue + element-ui 国际化实现
    async/await 处理多个网络请求同步问题
  • 原文地址:https://www.cnblogs.com/xujian2014/p/5642834.html
Copyright © 2011-2022 走看看