【问题标题】:How to find maximum of n elements in an unsorted array n times?After each time the value of one element is decreased by n in linear fashion如何在未排序的数组中找到 n 个元素的最大值 n 次?每次后一个元素的值以线性方式减少 n
【发布时间】:2018-08-02 12:50:04
【问题描述】:

示例:开头的数组是6 6 9 7,其中n=4

初始数组:6 6 9 7
第一个最大值:9
数组更改为:6 6 9 3(因为 arr[3]-4=3)
第二个最大值:9
数组更改为:6 6 5 3(因为 arr[2]-4=5)
第三个最大值:6
数组更改为:6 2 5 3(因为 arr[1]-4=2)
第四个最大值:6
数组更改为:2 2 5 3(因为 arr[0]-4=2)

这可以在 O(n^2) 中轻松实现,但可以更有效地完成吗?
以下是 O(n^2) 解决方案的代码:

int arr[]={6,6,9,7};
int n=4;
for(int i=0;i<n;i++)
{
   int max=0;
   for(int j=0;j<n;j++)
   {
       if(arr[j]>arr[max])
            max=j;
   }
   System.out.println(arr[max]);
   arr[n-1-i]-=n;
 }

【问题讨论】:

  • 目前还不清楚您到底想做什么。您想返回单个修改后的数组吗?还是您只想返回最终修改后的数组?向我们展示您的 O(n^2) 算法,或者给我们更详细的要求。
  • 只是那些最大值而不是修改后的数组
  • 我只是从最后一个单元格开始一个一个地从数组单元格中减去 n。之后在每个步骤中找到最大值。 @JimMischel
  • 添加了我的代码@JimMischel

标签: arrays algorithm sorting data-structures max


【解决方案1】:

如果你构建一个由最大堆和索引组成的单独数据结构,你可以在 O(n log n) 内完成。这个想法是,您可以以相反的顺序逐步遍历索引,每次调整最大堆中节点的值,然后在堆中向上或向下移动它。堆的根元素将始终包含当前的最大数量。此解决方案需要 O(n) 额外内存。

如果你想在 O(1) 额外内存的情况下就地执行此操作,你可以通过跟踪最大元素来使最佳案例时间 O(n),并且仅在最大元素时搜索新的最大值变化。这会稍微改善平均情况,但最坏的情况仍然是 O(n^2)。

【讨论】:

    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多