LeetCode.2908. 元素和最小的山形三元组 I

本文介绍了一种更高效的方法来解决LeetCode中的最小山形三元组问题,通过前后缀思想避免三层嵌套循环,利用后缀最小值和前缀最小值数组计算三数之和的最小值。
摘要由CSDN通过智能技术生成

题目

2908. 元素和最小的山形三元组 I

分析

首先,看到这道题,第一反应就是暴力方法,三层for循环,枚举每一种情况,代码如下

class Solution {
    public int minimumSum(int[] nums) {
        int min = Integer.MAX_VALUE;
        for(int i = 0;i < nums.length - 2;i ++) {
            for(int j = i+1;j < nums.length - 1;j ++) {
                for(int k = j+1;k < nums.length;k ++) {
                    if(nums[i] < nums[j] && nums[k] < nums[j])
                    min = Math.min(min,nums[i]+nums[j]+nums[k]);
                }
            }
        }
        return min ==  Integer.MAX_VALUE?-1:min;
    }
}

这虽然能通过LeetCode,但是太暴力了。我们还是要想一些其他方法来解决。我们可以利用前后缀的思想来解决,具体思路如下:

枚举nums[i],我们需要知道i左边的最小元素和i右边的最小元素,得到每一个nums[i]的左右两个元素和当前nums[i]相加,最小的值就是我们要求的值。

我们定义 suf[i] 表示 i 右边最小的值(包含i位置)。我们怎么求的这个值呢????我们从后向前遍历,suf[i] = Math.min(suf[i+1] , nums[i])

前缀最小值pre采取同样的方法,可以和答案一起计算,所以,只需要定义成一个变量即可。

三个数之和就是:pre + nums[i] + suf[i+1]。题目也就是让我们求这个的最小值。

代码

class Solution {
    public int minimumSum(int[] nums) {
        int n = nums.length;
        int[] suf = new int[n]; // 后缀最小值
        suf[n - 1] = nums[n-1];
        for(int i = n - 2;i > 1;i --) {
            suf[i] = Math.min(suf[i+1],nums[i]);
        }

        int ans = Integer.MAX_VALUE;
        int pre = nums[0]; // 前缀最小值
        for(int i = 1;i < n - 1;i ++) {
            if(pre < nums[i] && nums[i] > suf[i+1]) {
                ans = Math.min(ans,pre+nums[i]+suf[i+1]);
            }
            pre = Math.min(pre,nums[i]);
        }
        return ans == Integer.MAX_VALUE ? -1 : ans;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值