力扣100114. 元素和最小的山形三元组 II(中等)

简介: 力扣100114. 元素和最小的山形三元组 II(中等)

题目描述:

给你一个下标从 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 <= 105
  • 1 <= nums[i] <= 108

思路:

题目的意思是求元素和最小 的山形三元组,而且这三个数满足:

  • i < j < k
  • nums[i] < nums[j]nums[k] < nums[j]

也就是说中间那个数大于左右两边就行。

k的范围是1-nums.size()-2,我们遍历数组下标为1-nums.size()-2,当前的nums[i]表示的是山形三元组最中间的那个数,由于答案求元素和最小 ,每次遍历nums[i],都去找i前面最小的数,再去找i后面最小的数,这样求得的和对于nums[i]做山形三元组中间的数的所有三元组的和来说是最小的,遍历整个数组再对这个和取min就是答案了。

为什么这样求得的ans会是所有山形三元组的和的最小值呢?假设a[i]表示下标为i的元素作为山形三元组中间元素的最小和,a[i]=nums[i]+左边最小的数+右边最小的数,ans=min(a[i],ans).

所以ans是所有可能答案中的最小值。

代码:

class Solution {
public:
    int minimumSum(vector<int>& nums) {
        int len=nums.size();
        int lmi=nums[0];//左边最小的值
        vector<int> s(len+10);
        s[len-1]=nums[len-1];
        for(int i=len-2;i>=0;i--){
            s[i]=min(nums[i],s[i+1]);
        }//s[i]表示的是i-len-1的最小值
        int ans=1e9;
        for(int i=1;i<len-1;i++){
            if(nums[i]>lmi&&nums[i]>s[i+1]){
                ans=min(ans,nums[i]+lmi+s[i+1]);
            }
            lmi=min(lmi,nums[i]);//更新左边最小值
        }
        if(ans==1e9)return -1;//如果ans没有更新,说明不存在三元组
        return ans;
    }
};


相关文章
|
21天前
|
算法 测试技术 程序员
力扣经典150题第三十题:长度最小的子数组
力扣经典150题第三十题:长度最小的子数组
10 1
|
1月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
1月前
|
存储
力扣-2904最短且字典序最小的美丽子序列
力扣-2904最短且字典序最小的美丽子序列
15 1
|
17天前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
8 0
|
1月前
|
算法 搜索推荐 Java
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
17 3
|
21天前
|
存储 算法 Java
力扣经典150题第四十五题:存在重复元素 II
力扣经典150题第四十五题:存在重复元素 II
11 0
|
2月前
题目----力扣--移除链表元素
题目----力扣--移除链表元素
26 1
|
1月前
|
索引
leetcode题解:27.移除元素
leetcode题解:27.移除元素
19 0
|
2月前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
34 1
|
1月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串