Algorithm 计算一维数组中的最大油轮体积

Algorithm 计算一维数组中的最大油轮体积,algorithm,Algorithm,我有以下难题: 创建一种方法来计算用于容纳洪水的最大油轮体积。方法输入:一个一维整数数组和一个表示槽车宽度的整数值 integer getLargestTanker(Integer width, Integer[] values) 一维数组包含表示油轮高度的整数值。数组中这些整数值之间的距离表示油轮长度 例子 假设我们有以下数组: {2,9,6,3,5,7} 我们需要选择两个数字,使有效高度和长度(这两个数字之间的距离)的乘积最大。如果我们选择2和9,有效油轮高度为:2,距离为1。在本例中,最

我有以下难题: 创建一种方法来计算用于容纳洪水的最大油轮体积。方法输入:一个一维整数数组和一个表示槽车宽度的整数值

integer getLargestTanker(Integer width, Integer[] values)
一维数组包含表示油轮高度的整数值。数组中这些整数值之间的距离表示油轮长度

例子 假设我们有以下数组:
{2,9,6,3,5,7}
我们需要选择两个数字,使有效高度和长度(这两个数字之间的距离)的乘积最大。如果我们选择2和9,有效油轮高度为:2,距离为1。在本例中,最大油轮体积值为7x4x(静态给定宽度)。因为我们应该选择身高:9和7说明:有效高度为7(因为它是一艘能装水的油轮)。油轮的长度为4(指数-1和指数-7)

我的解决方案
两个嵌套循环。复杂性为O(n^2)。我坚信应该有更好的解决方案,但我想不出一个。您有什么更好的主意吗?

当配对两个高度时,音量由最小高度决定

然后,我们在这里集中讨论确定这一对的最小高度。 对于每个索引
i
,对应于高度
a[i]
,我们确定对应的最小和最大索引 所有
A
值大于
A[i]

为此,我们根据
A[i]
的值对索引进行排序。 对于给定的
i=index[j]
,对于
k>i
,所有的canditate索引都对应于
index[k]

一个简单的循环可以找到这些
索引[k]
的最小值和最大值

复杂性由排序决定:O(nlogn)

这里是C++的代码,它非常简单易懂,无论你使用什么语言。

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

int max_vol (const std::vector<int> &A) {
    int vmax = 0;
    int n = A.size();
    std::vector<int> index(n);
    std::iota (index.begin(), index.end(), 0);
    auto comp = [&] (int i, int j) {return A[i] < A[j];};
    std::sort (index.begin(), index.end(), comp);
    int index_max = index[n-1];
    int index_min = index[n-1];
    for (int i = n-2; i >= 0; --i) {
        int d0 = std::abs (index[i] - index_max);
        int d1 = std::abs (index[i] - index_min);
        int vol = std::max (d0, d1) * A[index[i]];
        if (vol > vmax) vmax = vol;
        index_max = std::max(index[i], index_max);
        index_min = std::min(index[i], index_min);      
    }
    return vmax;
}

int main() {
    std::vector<int> heights = {2, 9, 6, 3, 5, 7};
    auto max_volume = max_vol (heights);
    std::cout << "max volume = " << max_volume << std::endl;
}
#包括
#包括
#包括
#包括
int max_vol(常数std::vector&A){
int vmax=0;
int n=A.size();
std::向量指数(n);
std::iota(index.begin()、index.end()、0);
自动编译=[&](inti,intj){返回A[i]=0;--i){
int d0=标准::abs(指数[i]-指数最大值);
int d1=标准::abs(指数[i]-指数最小值);
int vol=std::max(d0,d1)*A[指数[i];
如果(vol>vmax)vmax=vol;
索引_max=std::max(索引[i],索引_max);
索引_min=标准::min(索引[i],索引_min);
}
返回vmax;
}
int main(){
向量高度={2,9,6,3,5,7};
自动最大音量=最大音量(高度);

STD:你的例子中的第74卷还是第28卷?我写了7×4(用星号和StasOpFoad格式化到74)。非常感谢大家的DSA问题:谢谢Abhinav,但是我想它是不一样的。在我的例子中,我不考虑这两个数字之间的数字。但是,这仍然是有用的,谢谢。