【问题标题】:n numbers are arranged in a circle. We need to find the maximum sum of consecutive nosn 个数字排列成一个圆圈。我们需要找到连续编号的最大总和
【发布时间】:2012-07-23 10:09:47
【问题描述】:

对于线性数组,求连续数的最大和的问题。简单。可以使用Kadane's Algo. 轻松完成。但是现在数组是圆形的,我们需要找到连续数的最大和。因此 startindex 和 endindex 可以在数组中的任何位置。我不知道如何在O(n) 时间内解决它。

例如:{ 8, 9, -14, 4, 3} .

最大子数组sum= 4+3+8+9= 24. startindex=3 and endindex=1(零索引数组)。 请给我一些关于如何解决这个问题的提示或算法。无需代码。

编辑:正如大家所提到的,循环数组类似于跨越两次的相同数组。但是如何在该数组上应用 Kadane 的算法并限制连续编号。到

【问题讨论】:

    标签: java c arrays algorithm kadanes-algorithm


    【解决方案1】:

    复制一次数组得到{ 8, 9, -14, 4, 3, 8, 9, -14, 4, 3}

    并找到长度不超过原圆的最大子数组。

    【讨论】:

      【解决方案2】:

      或者,与其复制数组,不如将索引变量的范围从0..n-1 扩展到0..2n-1,并使用(x mod n) 而不是x 作为索引。

      【讨论】:

        【解决方案3】:
        1. 这个概念是通过 Kadane 算法找到最大和。
        2. 然后通过 Kadane 算法通过对元素求反来找到最小和,并将其添加到数组的总和中。

        比打印第1步和第2步计算的元素的最大值。

        private static int maxCircularSum(int a[]) {
            int max_kadane = kadane(a);
            int max_wrap = 0, i;
            for (i = 0; i < a.length; i++) {
                max_wrap += a[i]; // Calculate array-sum
                a[i] = -a[i];  // invert the array (change sign)
            }
            max_wrap = max_wrap + kadane(a);
            return (max_wrap > max_kadane) ? max_wrap : max_kadane;
        }
        private static int kadane(int[] a) {
            int max = Integer.MIN_VALUE, sum = 0;
            for (int k : a) {
                sum = sum + k;
                if (sum < 0) {
                    sum = 0;
                }
                if (max < sum) {
                    max = sum;
                }
            }
            return max;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-24
          • 2017-03-12
          • 2020-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-06
          相关资源
          最近更新 更多