【发布时间】:2022-06-12 16:42:21
【问题描述】:
我有一个数字数组[3,4,5,1,2,3,1] 找到3 pairs 子序列说sub[] 这样sub[0] < sub[1] > sub[2],将这三个元素相加并得到最小和。
示例:
对于[3,4,5,1,2,3,1],我可以在这里选择[1,2,1] 1<2>1 所以总和是1+2+1 = 4,这是最小值。
约束:
数组大小最大为 1,00,000 每个元素大小为 1 到 1,00,00,00,000
我的方法是使用 3 个嵌套的 for 循环并获得最小总和,这不是一种有效的方法。
public long process(List<Integer> list) {
int n = list.size();
long output = Long.MAX_VALUE;
for(int i=0; i<n; i++) {
for(int j=i+1; j<n; j++) {
if(list.get(i) < list.get(j)) {
for(int k=j+1; k<n; k++) {
if(list.get(j) > list.get(k)) {
output = Math.min(output, list.get(i)+list.get(j)+list.get(k));
}
}
}
}
}
return output;
}
如何以更少的时间复杂度有效地解决这个程序?
【问题讨论】:
-
使用前缀数组存储从左到当前索引的最小元素;类似地使用后缀数组来存储从右到当前索引的最小元素。然后对于每个索引,确定是否 prefix[index] suffix[index]。如果是这样,计算他们的
sum。对所有索引执行此操作并返回最小值。 -
使用滑动窗口协议
标签: java algorithm time-complexity