zoukankan      html  css  js  c++  java
  • 练习题 求a[i]到a[j]累积和为最大的部分

    原文发布时间为:2009-03-09 —— 来源于本人的百度文章 [由搬家工具导入]

    1、有一个数组a[n],里面的数只有两种:-1或1。i,j是两个整数,假设0<=i<=j<=n-1,找出a[i]到a[j]中连续数之和最大的部分(如果最大部分存在相等的则优先找最短的)。

    2、有一个数组a[n],里面含有正数负数,假设0<=i<=j<=n-1,找出a[i]到a[j]中连续数之和最大的部分(如果最大部分存在相等的则优先找最短的)。

    这两题是一样的题目,解法如下:

    //算法依据:
    //如果a[i],a[i+1],,,,a[j] 是所求的最大子段,那么
    //1:对于任何一个i <= k <= j的数 k,a[i]+a[i+1]+...+a[k]必然是不小于零的。
    //2:对于任何一个i <= x <= j的数 x,a[x]+a[x+1]+...+a[j]必然是不小于零的。
    //3:对于任何一个0 <= y < i的数 y,a[y]+a[y+1]+...+a[i-1]必然是小于零的。
    //4:对于任何一个j < z     的数 z,a[j+1]+a[j+2]+...+a[z]必然是小于零的。
    using System;
    public class Class3
    {
        public static void Main()//找出a[i]到a[j] 中连续数之和的最大部分
        {
            int[] a = new int[] { -1, 1, 1, -1, 1, 1, -1, -1, 2 };
            int length = a.Length;
            int i = 0, j = 0, begin = 0, end = 0, sum = 0, tempSum = 0;

            for (i = 0; i < length; ++i)
            {
                tempSum += a[i];
                if (tempSum > sum)
                {
                    begin = j;
                    end = i;
                    sum = tempSum;
                }
                else if (tempSum <= 0)
                {
                    tempSum = 0;
                    j = i + 1;
                }
            }
            Console.WriteLine("Max is from a[{0}] to a[{1}] ,Sum is {2}", begin, end, sum);
            Console.ReadLine();
        }
    }

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/handboy/p/7153320.html
Copyright © 2011-2022 走看看