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,但是我想它是不一样的。在我的例子中,我不考虑这两个数字之间的数字。但是,这仍然是有用的,谢谢。