zoukankan      html  css  js  c++  java
  • 8.9. 最大连续子段和,以及循环最大连续子段和。

    8. 有一个包含n个元素的数组arr,计算最大的子段和(允许空段),即max(0, max_{i leq j} sum_{k=i}^j arr_k)

    9. 有一个包含n个元素的首尾相连的环形数组arr,计算最大的子段和(允许空段)。

    样例:数组[1, 3, -2, 6, -1],最大子段和应该为9,对应的子段为[6, -1, 1, 3]。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication8
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] inputArr = { 1, -2, 3, 10, -4, 7, 2, -5 };
                int[] inputArr2 = { 1, 3, -2, 6, -1 };
                Console.WriteLine(MaxSumSubArray(inputArr));
                Console.WriteLine(MaxSumSubLoopArray(inputArr2));
            }
    
            static int MaxSumSubArray(int[] input)
            {
                if (input == null || input.Length == 0)
                {
                    throw new Exception("input can't be empty.");
                }
    
                int result = 0;
                int sum = 0;
    
                for (int i = 0; i < input.Length; i++)
                {
                    if (sum <0)
                    {
                        sum = 0;
                    }
                    sum += input[i];
                    if (sum > result)
                    {
                        result = sum;
                    }
                }
    
                if (result == 0)
                {
                    result = input[0];
                    for (int i = 0; i < input.Length; i++)
                    {
                        if (input[i]>result)
                        {
                            result = input[i];
                        }
                    }
                }
                return result;
            }
    
            static int MaxSumSubLoopArray(int[] input)
            {
                int[] intArr = new int[input.Length*2];
                for (int i = 0; i < input.Length; i++)
                {
                    intArr[i] = input[i];
                    intArr[i + input.Length] = input[i];
                }
    
                int count = 0;
                int sum = 0;
                int result = 0;
                for (int i = 0; i < intArr.Length; i++)
                {
                    sum = 0;
                    count = 0;
                    for (int j = i; j < intArr.Length; j++)
                    {
                        if (sum<0||count==input.Length-1)
                        {
                            break;
                        }
                        sum += intArr[j];
                        count++;
                        if (sum>result)
                        {
                            result = sum;
                        }
                    }
                }
                return result;
    
            }
        }
    }
    View Code
  • 相关阅读:
    JavaScript父子页面之间的相互调用
    把一个集合自定转成json字符串
    分页类与前台和后台的调用方法
    移动App测试实战—专项测试
    功能测试需求分析方法
    App弱网测试
    App常见产品问题及预防方法
    21天,搞定软件测试从业者必备的Linux命令
    Docker入门
    Linux核心-慧测课堂笔记
  • 原文地址:https://www.cnblogs.com/Ligeance/p/3535691.html
Copyright © 2011-2022 走看看