1. 题意
求
m
i
n
(
a
i
+
a
j
+
a
k
)
,
a
j
>
a
k
,
a
j
>
a
i
,
i
<
j
<
k
min(a_i + a_j + a_k), a_j >a_k,a_j > a_i,i \lt j \lt k
min(ai+aj+ak),aj>ak,aj>ai,i<j<k
元素和最小的山形三元组
2. 题解
枚举 j j j,求出 P r e M i n ( j − 1 ) PreMin(j - 1) PreMin(j−1)与 S u f M i n ( j + 1 ) SufMin(j +1) SufMin(j+1)
- 代码
class Solution {
public:
int minimumSum(vector<int>& nums) {
int sz = nums.size();
vector<int> suf(sz);
suf[sz - 1] = nums[sz - 1];
for ( int i = sz - 2; ~i; --i ) {
suf[i] = min(suf[i + 1], nums[i]);
}
int ans = -1;
int pre = nums[0];
for ( int i = 1; i < sz - 1; ++i ) {
if ( nums[i] > pre && nums[i] > suf[i + 1]) {
int sum = nums[i] + pre + suf[i + 1];
if ( ans == -1)
ans = sum;
else
ans = min(ans, sum);
}
pre = min(pre, nums[i]);
}
return ans;
}
};
- 代码二
class Solution {
public:
int minimumSum(vector<int>& nums) {
int INF = 0x3f3f3f3f;
int ans = INF;
int sz = nums.size();
vector<int> pre(sz, INF);
vector<int> suf(sz, INF);
int minv = INF;
int rminv = INF;
for (int i = 0; i < sz; ++i) {
minv = min(minv, nums[i]);
rminv = min(rminv, nums[sz - 1 - i]);
pre[i] = minv;
suf[sz - 1 - i] = rminv;
}
for (int i = 1; i < sz -1; ++i) {
// std::cout << pre[i - 1] <<":"<< nums[i] << ":" << suf[i + 1] << std::endl;
if ( nums[i] > pre[i - 1] && nums[i] > suf[i + 1]) {
ans = min(nums[i] + pre[i - 1] + suf[i + 1], ans);
}
}
return ans == INF ? -1 : ans;
}
};
UPD
2024/3/29 每日一题