题目:2874. 有序三元组中的最大值 II
思路:预处理出f[k]:范围[k,n-1]之间的最大值,然后枚举j,同时维护范围[0,j-1]之间的最大值,即i。时间复杂度0(n)。## 标题
C++版本:
class Solution {
public:
long long maximumTripletValue(vector<int>& nums) {
int n=nums.size();
//预处理出f[k]:范围[k,n-1]之间的最大值
vector<int> f(n);
f[n-1]=nums[n-1];
for(int i=n-2;i>=0;i--){
f[i]=max(f[i+1],nums[i]);
}
long long mx=0;
int left=nums[0];
//枚举j,同时维护范围[0,j-1]之间的最大值,即left
for(int i=1;i<n-1;i++){
mx=max(mx,1LL*(left-nums[i])*f[i+1]);
left=max(left,nums[i]);
}
return mx;
}
};
JAVA版本:
class Solution {
public long maximumTripletValue(int[] nums) {
int n=nums.length;
int[] f=new int[n];
f[n-1]=nums[n-1];
for(int i=n-2;i>=0;i--){
f[i]=Math.max(f[i+1],nums[i]);
}
long mx=0;
int left=nums[0];
for(int i=1;i<n-1;i++){
mx=Math.max(mx,1L*(left-nums[i])*f[i+1]);
left=Math.max(left,nums[i]);
}
return mx;
}
}
Go语言:
func maximumTripletValue(nums []int) int64 {
n := len(nums)
f := make([]int,n)
f[n-1]=nums[n-1]
for i:=n-2;i>=0;i-- {
f[i]=max(f[i+1],nums[i])
}
var res int64 = 0
mx :=nums[0]
for i:=1;i<n-1;i++ {
res = max(res,int64(mx-nums[i])*int64(f[i+1]))
mx=max(mx,nums[i])
}
return res
}