2908.元素和最小的山形三元组 I
【LetMeFly】2908.元素和最小的山形三元组 I:贪心(两次遍历)——双O(n)复杂度
力扣题目链接:https://leetcode.cn/problems/minimum-sum-of-mountain-triplets-i/
给你一个下标从 0 开始的整数数组 nums
。
如果下标三元组 (i, j, k)
满足下述全部条件,则认为它是一个 山形三元组 :
i < j < k
nums[i] < nums[j]
且nums[k] < nums[j]
请你找出 nums
中 元素和最小 的山形三元组,并返回其 元素和 。如果不存在满足条件的三元组,返回 -1
。
示例 1:
输入:nums = [8,6,1,5,3] 输出:9 解释:三元组 (2, 3, 4) 是一个元素和等于 9 的山形三元组,因为: - 2 < 3 < 4 - nums[2] < nums[3] 且 nums[4] < nums[3] 这个三元组的元素和等于 nums[2] + nums[3] + nums[4] = 9 。可以证明不存在元素和小于 9 的山形三元组。
示例 2:
输入:nums = [5,4,8,7,10,2] 输出:13 解释:三元组 (1, 3, 5) 是一个元素和等于 13 的山形三元组,因为: - 1 < 3 < 5 - nums[1] < nums[3] 且 nums[5] < nums[3] 这个三元组的元素和等于 nums[1] + nums[3] + nums[5] = 13 。可以证明不存在元素和小于 13 的山形三元组。
示例 3:
输入:nums = [6,5,4,3,4,5] 输出:-1 解释:可以证明 nums 中不存在山形三元组。
提示:
3 <= nums.length <= 50
1 <= nums[i] <= 50
解题方法:两次遍历
我们可以枚举中间j
的位置。对于nums[j]
,最优解是加上左边所有数中最小的那个 再加上 右边所有数中最小的那个。(如果两边最小都小于nums[j]
的话)
因此我们可以开辟一个leftMin
数组,其中leftMin[i]
为nums[0]
到nums[i]
中所有值的最小值。这个数组只需要遍历一遍nums
即可得到。
接着从右往左遍历j
的位置,并使用一个变量rightMin
记录右边的最小值,遍历完成后即可得知所有合法山形三元组
中最小的那个了。
- 时间复杂度$O(n)$
- 空间复杂度$O(n)$
AC代码
C++
1 |
|
Python
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137151595
2908.元素和最小的山形三元组 I
https://blog.letmefly.xyz/2024/03/29/LeetCode 2908.元素和最小的山形三元组I/