zoukankan      html  css  js  c++  java
  • 求连续子数组的最大和

     一、题目:

      这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。

     

    二、解法:

      解法一:暴力求解法

    /*
     (1) 常规方法,时间复杂度O(n*n) 
     (2) 先从第一个元素开始向后累加, 
     (3)每次累加后与之前的和比较,保留最大值, 
     (4) 再从第二个元素开始向后累加,以此类推
    */
    
     public static int maxSubSum1(int[] arr, int len) {
            int i, j;
            int maxSum = 0;
            //每次开始累加的起始位置的循环  
            for (i = 0; i < len; i++) {
                int curSum = 0;
                //向后累加的循环  
                for (j = i; j < len; j++) {
                    curSum += arr[j];
                    if (curSum > maxSum)
                        maxSum = curSum;
                }
            }
            return maxSum;
        }
    View Code

          解法二:线性时间算法(推荐)

      /* 
    (1)  最优方法,时间复杂度O(n) 
     (2) 和最大的子序列的第一个元素肯定是正数 
     (3) 因为元素有正有负,因此子序列的最大和一定大于0 
       */
     public static int maxSubSum(int[] arr, int len) {
            int i;
            int maxSum = 0;
            int curSum = 0;//子数组的和
            for (i = 0; i < len; i++) {
                curSum += arr[i];
                if (curSum > maxSum)
                    maxSum = curSum;
                //如果累加和出现小于0的情况,
                //则和最大的子序列肯定不可能包含前面的元素,
                //这时将累加和置0,从下个元素重新开始累加
                if (curSum < 0)
                    curSum = 0;
            }
            return maxSum;
        }
    View Code
  • 相关阅读:
    SQLServer限制IP,限制用户,限制SSMS登录
    关于Natively Compiled Stored Procedures的优化
    .NET/C#- EPPLUS DEMO
    ASP.NET MVC- 视图
    ASP.NET MVC- 在Area里使用RedirectToAction跳转出错的解决方法
    ASP.NET MVC- 解决HTML转码
    ASP.NET MVC- KindEditor的使用
    ASP.NET MVC- Upload File的例子
    ASP.NET MVC- ActionFilter的使用
    ASP.NET MVC- UrlHelper的用法
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7538420.html
Copyright © 2011-2022 走看看