LeetCode算法心得——元素和最小的山形三元组 II(预处理和简单动规)

本文主要是介绍LeetCode算法心得——元素和最小的山形三元组 II(预处理和简单动规),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我是晴天学长,枚举+简单的动态规划思想,和前段时间的周赛题的写法可以说一模一样,像这种类似3元的题,要控制时间复杂度的话,只能枚举一个变量,所以要前缀和或者动规等待。需要的小伙伴可以关注支持一下哦!后续会继续更新的。


1) .元素和最小的山形三元组 II

在这里插入图片描述
元素和最小的山形三元组 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


2) .算法思路

方法一:(枚举j)
1.预处理k(右边的最大值)
2.遍历j,维护前面的最小值。
方法二.(简单动规)
1.遍历k
2.维护前面i,j,为前面的符合条件的两个最小值。


3) .算法步骤

1.初始化premin为数组的第一个元素nums[0],作为当前位置的左侧最小值。
2.初始化变量n为数组的长度。
3.创建一个长度为n的整数数组rightmin,用于存储每个位置右侧的最小值。
4.初始化变量rightMin为数组的最后一个元素nums[n - 1],作为最后一个位置的右侧最小值。
5.从数组的最后一个位置开始,倒序遍历数组,更新rightMin为当前位置及其右侧的最小值,并将其存储到rightmin数组中。
6.初始化变量ans为整型最大值,用于记录满足条件的最小和。
7.从数组的第二个位置开始,遍历到倒数第二个位置,依次判断当前位置的值是否满足条件。
8.如果当前位置的值大于左侧的最小值premin,并且大于右侧的最小值rightmin[i+1],则满足条件。
9.更新ans为当前位置的值与左右最小值的和的最小值。
10更新premin为当前位置的值与左侧最小值premin的较小值。
11.最后,如果ans仍然等于整型最大值,则说明没有满足条件的最小和,返回-1。
12.否则,将ans转换为整数并返回作为结果。


4).代码示例

class Solution {public int minimumSum(int[] nums) {int premin = nums[0];int n = nums.length;int[] rightmin = new int[n];int rightMin = nums[n - 1];//预处理for (int i = n - 1; i >= 0; i--) {rightMin = Math.min(rightMin, nums[i]);rightmin[i] = rightMin;}//遍历jlong ans = Integer.MAX_VALUE;for (int i = 1; i < n - 1; i++) {if (premin < nums[i] && rightmin[i+1] < nums[i]){ans = Math.min(ans, premin+nums[i]+rightmin[i+1]);}premin = Math.min(premin, nums[i]);}if (ans == Integer.MAX_VALUE){return -1;}return (int) ans;}
}

5).总结

  • 注意数组越界。
  • 变量的正确赋值。

试题链接:

这篇关于LeetCode算法心得——元素和最小的山形三元组 II(预处理和简单动规)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/268320

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16