首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组平衡点

数组平衡点
EN

Stack Overflow用户
提问于 2011-03-23 05:50:22
回答 5查看 2.1K关注 0票数 4

解决这个问题的最好方法是什么?N元数组A的平衡点是索引i,使得较低索引上的所有元素具有值<= Ai,而较高索引上的所有元素具有大于或等于Ai的值。

例如,给定:

A=4 A1=2 A2=7 A3=11 A4=9

正确的解决方案之一是: 2. A2以下的所有元素都小于A2,A2之后的所有元素都大于A2。出现在我脑海中的一个解决方案是O(nsquare)解决方案。有没有更好的解决方案?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-23 05:59:09

首先假设A[0]是一根杆子。然后开始遍历数组;将每个元素A[i]依次与A[0]进行比较,并跟踪当前的最大值。

一旦找到A[i] < A[0]这样的i,就会知道A[0]不能再是一个极点,延伸到A[i]之前的任何元素也不能。所以现在继续遍历,直到找到下一个大于当前最大值的值。然后,这将成为新提议的极点。

因此,一个O(n)解!

在代码中:

代码语言:javascript
复制
int i_pole = 0;
int i_max  = 0;
bool have_pole = true;
for (int i = 1; i < N; i++)
{
    if (A[i] < A[i_pole])
    {
        have_pole = false;
    }
    if (A[i] > A[i_max])
    {
        i_max = i;
        if (!have_pole)
        {
            i_pole = i;
        }
        have_pole = true;
    }
}
票数 5
EN

Stack Overflow用户

发布于 2011-03-23 06:15:50

如果您想知道所有极点的位置,O(n log n)解决方案将是创建数组的排序副本,并查看从何处获得匹配值。

编辑:很抱歉,但这实际上不起作用。一个反例是[2, 5, 3, 1, 4]

票数 3
EN

Stack Overflow用户

发布于 2011-03-23 08:22:06

创建两个辅助数组,每个辅助数组的元素数量与输入数组相同,分别称为MIN和MAX。MAX的每个元素M包含来自0..M的输入中的所有元素的最大值。MIN的每个元素M包含来自M..N-1的输入中的所有元素的最小值。

对于输入数组的每个元素M,将其值与MIN和MAX中的相应值进行比较。如果INPUTM == MINM和INPUTM == MAXM,则M是一个平衡点。

构建MIN需要N个步骤,MAX也是如此。然后再执行N个步骤来测试阵列。这个解决方案的复杂度为O(N),并且找到了所有的平衡点。在排序输入的情况下,每个元素都是一个平衡点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5398280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档