原题:2909. 元素和最小的山形三元组 II - 力扣(LeetCode)
这一题的数据范围:
3<= nums.length <= 10^5
1 <= nums[i] <=10^5
像这种三元组类型的题目,一个通常的做法是枚举中间的数。
知道了 nums[j],只需要知道 j 左边的最小值和右边的最小值,就知道了三元组的和的最小值。
右边的最小值可以推导出来(后缀)。定义 fr[i] 表示从 nums[i]到 nums[n−1]的最小值,则有
fr[i]=Math.min( fr[i+1] , nums[i])
前缀最小值 pre的计算方式同理,可以和答案一起算,所以只需要一个变量。
那么答案就是
min = Math.min(pre + nums[i] + fr[i+1],min)
Java代码如下
class Solution {
public int minimumSum(int[] nums) {
int n = nums.length;
int min = Integer.MAX_VALUE;
//枚举记录每个i ~ n-1最小的数
int[] fr = new int[n];
fr[n-1] = nums[n-1];
for(int i = n-2; i > 1; i--){ //相当于满足条件k的索引
fr[i] = Math.min(nums[i], fr[i+1]);
}
int pre = nums[0];
for(int i = 1; i < n-1; i++){ //只需要遍历j,pre为左边最小值,fr[i]为右边最小值
if(pre >= nums[i]){
pre = nums[i];
}else if(fr[i+1] < nums[i]) min = Math.min(pre + nums[i] + fr[i+1], min);
}
return min == Integer.MAX_VALUE? -1 : min;
}
}
类似题: