当前位置: 首页 > news >正文

LeetCode 2908.元素和最小的山形三元组 I:贪心(两次遍历)——双O(n)复杂度

【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) O(n)
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++
class Solution {
public:int minimumSum(vector<int>& nums) {vector<int> leftMin(nums.size());leftMin[0] = nums[0];for (int i = 1; i < nums.size(); i++) {leftMin[i] = min(nums[i], leftMin[i - 1]);}int rightMin = nums.back();int ans = 1e7;for (int i = nums.size() - 2; i > 0; i--) {if (nums[i] > leftMin[i - 1] && nums[i] > rightMin) {ans = min(ans, nums[i] + leftMin[i - 1] + rightMin);}rightMin = min(rightMin, nums[i]);}return ans == 1e7 ? -1 : ans;}
};
Python
# from typing import Listclass Solution:def minimumSum(self, nums: List[int]) -> int:leftMin = [0] * len(nums)leftMin[0] = nums[0]for i in range(1, len(nums)):leftMin[i] = min(leftMin[i - 1], nums[i])rightMin = nums[-1]ans = 1_000_000for i in range(len(nums) - 2, 0, -1):if nums[i] > leftMin[i - 1] and nums[i] > rightMin:ans = min(ans, nums[i] + leftMin[i - 1] + rightMin)rightMin = min(rightMin, nums[i])return ans if ans < 1_000_000 else -1

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137151595

相关文章:

  • kafka部署之简单密钥
  • 【设计模式】工厂方法模式详解
  • 输出1到10的阶乘--C语言
  • linux之自主shell编写
  • 【MATLAB源码-第22期】基于matlab的手动实现的(未调用内置函数)CRC循环码编码译码仿真。
  • 关于MD5加密
  • uniapp实现列表动态添加
  • 软考105-上午题-【结构化开发】-系统文档
  • uniapp保留两位小数,整数后面加.00
  • window下迁移SVN仓库到新的windows服务器
  • 支付后打开半屏小程序能力的相关调整通知
  • C语言优先级浅记
  • node.js学习(2)
  • .Net Web窗口页属性
  • go |struct embedding、generics、goroutine
  • @angular/forms 源码解析之双向绑定
  • [case10]使用RSQL实现端到端的动态查询
  • [译]如何构建服务器端web组件,为何要构建?
  • Android Volley源码解析
  • codis proxy处理流程
  • CSS 专业技巧
  • Java读取Properties文件的六种方法
  • Java精华积累:初学者都应该搞懂的问题
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • node和express搭建代理服务器(源码)
  • python_bomb----数据类型总结
  • Python学习之路16-使用API
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 阿里云Kubernetes容器服务上体验Knative
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 对象引论
  • 后端_ThinkPHP5
  • 基于webpack 的 vue 多页架构
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 力扣(LeetCode)357
  • 那些年我们用过的显示性能指标
  • 你真的知道 == 和 equals 的区别吗?
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用 @font-face
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (007)XHTML文档之标题——h1~h6
  • (Python) SOAP Web Service (HTTP POST)
  • (八)Spring源码解析:Spring MVC
  • (二)换源+apt-get基础配置+搜狗拼音
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (原創) 未来三学期想要修的课 (日記)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .jks文件(JAVA KeyStore)
  • .net core 6 redis操作类
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .Net6使用WebSocket与前端进行通信