目录
一、题目
1、题目描述
2、接口描述
cpp
python3
3、原题链接
二、解题报告
1、思路分析
2、复杂度
3、代码详解
cpp
python3
一、题目
1、题目描述
给你一个下标从 0 开始的整数数组
nums
。如果下标三元组
(i, j, k)
满足下述全部条件,则认为它是一个 山形三元组 :
i < j < k
nums[i] < nums[j]
且nums[k] < nums[j]
请你找出
nums
中 元素和最小 的山形三元组,并返回其 元素和 。如果不存在满足条件的三元组,返回-1
。
2、接口描述
cpp
class Solution {
public:int minimumSum(vector<int>& nums) {}
};
python3
class Solution:def minimumSum(self, nums: List[int]) -> int:
3、原题链接
2908. 元素和最小的山形三元组 I
二、解题报告
1、思路分析
预处理pre[i],pre[i]即[0, i - 1]中最小的数
同理,后缀最小也可以预处理,不过我们可以倒序遍历的时候维护
如果nums[i] > pre[i] && nums[i] < post[i],那么就维护答案
2、复杂度
时间复杂度: O(n)空间复杂度:O(n)
3、代码详解
cpp
class Solution {
public:int minimumSum(vector<int>& nums) {int n = nums.size(), ret = 180;vector<int> pre;for(int i = 0, mi = 55; i < n; i++)pre.emplace_back(mi), mi = min(mi, nums[i]);for(int i = n - 2, mi = nums[n - 1]; i >= 0; i--){if(nums[i] > pre[i] && nums[i] > mi)ret = min(ret, pre[i] + nums[i] + mi);mi = min(mi, nums[i]);}return ret != 180 ? ret : -1;}
};
python3
class Solution:def minimumSum(self, a: List[int]) -> int:pre = []n, mi, ret = len(a), 55, 180for x in a:pre.append(mi)mi = min(mi, x)mi = a[n - 1]for i in range(n - 2, 0, -1):if pre[i] < a[i] > mi:ret = min(ret, a[i] + pre[i] + mi)mi = min(mi, a[i])return ret if ret < 180 else -1