1. 题意
给定一个数组,求 m a x { ( n u m i − n u m j ) ∗ n u m k } , i < j < k max\{(num_i - num_j) *num_k\},i \lt j \lt k max{(numi−numj)∗numk},i<j<k
2. 题解
枚举j
, 或者枚举k
。
2.1 枚举k
a n s = M a x ( n u m k ∗ M a x ( n u m i − n u m j , i < j < k ) ) , 1 < k < s z ans = Max(num_k*Max(num_i -num_j, i \lt j \lt k) ),1 \lt k \lt sz ans=Max(numk∗Max(numi−numj,i<j<k)),1<k<sz
求数组中最大的差值就等同于买卖股票的最佳时机。
- 代码
class Solution {
public:
long long maximumTripletValue(vector<int>& nums) {
long long ans = 0;
int sz = nums.size();
long long preMax = nums[0];
long long diff = 0;
for (int i = 1; i < sz; ++i) {
ans = max(diff * nums[i], ans);
diff = max(diff, preMax - nums[i]);
preMax = max(preMax, static_cast<long long>(nums[i]) );
}
return ans;
}
};
2.2 枚举j
只需要维护一个前缀最大值和后缀最大值就可以了。
即在求得ans
时,需要知道
- m a x ( n u m s i , i < j ) max(nums_i, i < j) max(numsi,i<j)
- m a x ( n u m s k , k > j ) max(nums_k,k > j) max(numsk,k>j)
- 代码
class Solution {
public:
long long maximumTripletValue(vector<int>& nums) {
int sz = nums.size();
vector<int> suf(sz);
int mx = nums[sz - 1];
for ( int i = sz - 1; ~i; --i) {
mx = max(mx, nums[i]);
suf[i] = mx;
}
int leftMx = nums[0];
long long ans = 0;
for ( int i = 1; i < sz - 1; ++i) {
long long cur = 1l * (leftMx - nums[i]) * suf[i + 1];
ans = max(ans, cur);
leftMx = max(nums[i], leftMx);
}
return ans;
}
};