LeetCode 2909. 元素和最小的山形三元组 II
**### LeetCode 2909. 元素和最小的山形三元组 II
问题描述
给定一个下标从 0 开始的整数数组 nums,我们需要找到一个“山形三元组”(i, j, k)满足以下条件:
i < j < knums[i] < nums[j]且nums[k] < nums[j]
并且返回这个三元组的元素和 nums[i] + nums[j] + nums[k]。如果不存在符合条件的三元组,返回 -1。
思路分析
我们可以使用优化的双指针方法来高效解决该问题。
关键思路:
-
前缀和: 遍历数组时,记录每个元素之前的最小值。我们称之为“前缀最小值”。通过前缀最小值可以很快找到左边比当前元素小的元素
nums[i]。 -
后缀最小值: 类似地,我们还需要维护一个“后缀最小值”数组,记录每个元素后面的最小值。通过后缀最小值,可以快速找到右边比当前元素小的元素
nums[k]。 -
遍历中间元素: 在固定中间位置
j的时候,检查其左边是否有比它小的元素nums[i](通过前缀最小值)以及右边是否有比它小的元素nums[k](通过后缀最小值)。如果存在这样的i和k,就计算当前的三元组和,并更新最小值。 -
返回结果: 在所有符合条件的三元组中,返回最小和。如果没有符合条件的三元组,返回
-1。
代码实现
class Solution:def minimumSum(self, nums: List[int]) -> int:n = len(nums)# 计算后缀最小值数组suf = [0] * nsuf[-1] = nums[-1]for i in range(n-2, -1, -1):suf[i] = min(suf[i+1], nums[i])# 初始化前缀最小值和结果pre, ans = nums[0], float('inf')# 遍历数组,寻找符合条件的三元组for i in range(1, n-1):if pre < nums[i] > suf[i]:ans = min(ans, pre + nums[i] + suf[i+1])pre = min(pre, nums[i])return ans if ans < float('inf') else -1
代码解释
-
后缀最小值
suf数组:suf = [0] * n suf[-1] = nums[-1] for i in range(n-2, -1, -1):suf[i] = min(suf[i+1], nums[i])- 该数组记录每个位置
i右侧的最小值。suf[i]表示从位置i到数组末尾之间的最小值。 suf[-1]初始化为nums[-1],然后从后向前计算其他元素的后缀最小值。
- 该数组记录每个位置
-
前缀最小值
pre和结果ans:pre, ans = nums[0], float('inf')pre记录当前元素左侧的最小值,用来和当前元素nums[i]比较,确保nums[i]是一个合法的山形三元组的中间元素。ans用来记录所有符合条件的三元组中的最小和。
-
遍历并计算三元组和:
for i in range(1, n-1):if pre < nums[i] > suf[i]:ans = min(ans, pre + nums[i] + suf[i+1])pre = min(pre, nums[i])- 对每个位置
i,如果nums[i]大于pre(左侧最小值)且大于suf[i](右侧最小值),则说明该位置可以作为山形三元组的中间元素nums[j]。 - 更新最小和
ans,并且在每次遍历时更新pre,即记录当前元素nums[i]作为新的左侧最小值。
- 对每个位置
-
返回结果:
return ans if ans < float('inf') else -1- 如果
ans仍然为float('inf'),则表示没有找到符合条件的三元组,返回-1。
- 如果
时间复杂度
- 计算后缀最小值的时间复杂度是
O(n)。 - 遍历数组的时间复杂度是
O(n)。
因此,总的时间复杂度是 O(n),对于 n 最大为 10^5 的情况非常高效。
示例分析
示例 1:
输入:
nums = [8, 6, 1, 5, 3]
输出:
9
解释:三元组 (2, 3, 4) 满足条件,最小和为 nums[2] + nums[3] + nums[4] = 9。
示例 2:
输入:
nums = [5, 4, 8, 7, 10, 2]
输出:
13
解释:三元组 (1, 3, 5) 满足条件,最小和为 nums[1] + nums[3] + nums[5] = 13。
示例 3:
输入:
nums = [6, 5, 4, 3, 4, 5]
输出:
-1
解释:没有符合条件的山形三元组。
总结
通过计算前缀和后缀最小值数组,并结合双指针技巧,我们能够高效地找到符合条件的山形三元组并计算其最小和。这样,我们的解决方案达到了 O(n) 的时间复杂度,能够处理大规模数据输入。**
相关文章:
LeetCode 2909. 元素和最小的山形三元组 II
**### LeetCode 2909. 元素和最小的山形三元组 II 问题描述 给定一个下标从 0 开始的整数数组 nums,我们需要找到一个“山形三元组”(i, j, k)满足以下条件: i < j < knums[i] < nums[j] 且 nums[k] < nums[j] 并…...
搬迁至bilibili声明
我将搬迁到bilibili ,用户名:北苏清风 在这个用户名上的文章部分将出自csdn的这个账号,均属于本人原创...
【周易哲学】生辰八字入门讲解(八)
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解【周易哲学】生辰八字入门讲解,期待与你一同探索、学习、进步,一起卷起来叭! 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…...
复制粘贴小工具——Ditto
在日常工作中,复制粘贴是常见的操作,但Windows系统自带的剪贴板功能较为有限,只能保存最近一次的复制记录,这对于需要频繁复制粘贴的用户来说不太方便。今天,我们介绍一款开源、免费且功能强大的剪贴板增强工具——Dit…...
3、从langchain到rag
文章目录 本文介绍向量和向量数据库向量向量数据库 索引开始动手实现rag加载文档数据并建立索引将向量存放到向量数据库中检索生成构成一条链 本文介绍 从本节开始,有了上一节的langchain基础学习,接下来使用langchain实现一个rag应用,并稍微…...
稀疏进化训练:机器学习优化算法中的高效解决方案
稀疏进化训练:机器学习优化算法中的高效解决方案 稀疏进化训练:机器学习优化算法中的高效解决方案引言第一部分:背景与动机1.1 传统优化算法的局限性1.2 进化策略的优势1.3 稀疏性的重要性 第二部分:稀疏进化训练的核心思想2.1 稀…...
10 Flink CDC
10 Flink CDC 1. CDC是什么2. CDC 的种类3. 传统CDC与Flink CDC对比4. Flink-CDC 案例5. Flink SQL 方式的案例 1. CDC是什么 CDC 是 Change Data Capture(变更数据获取)的简称。核心思想是,监测并捕获数据库的变动(包括数据或数…...
【LeetCode 刷题】回溯算法-子集问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法子集问题相关的题目解析。 文章目录 78.子集90.子集II 78.子集 题目链接 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res, path [], []def dfs(start: int) ->…...
OpenCV 版本不兼容导致的问题
问题和解决方案 今天运行如下代码,发生了意外的错误,代码如下,其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…...
低成本、高附加值,具有较强的可扩展性和流通便利性的行业
目录 虚拟资源类 1. 网课教程 2. 设计素材 3. 软件工具 服务类 1. 写作服务 2. 咨询顾问 3. 在线教育 4. 社交媒体管理 虚拟资源类 1. 网课教程 特点:高附加值,可复制性强,市场需求大。 执行流程: 选择领域:…...
DirectShow过滤器开发-读视频文件过滤器(再写)
下载本过滤器DLL 本过滤器读取视频文件输出视频流和音频流。流类型由文件决定。已知可读取的文件格式有:AVI,ASF,MOV,MP4,MPG,WMV。 过滤器信息 过滤器名称:读视频文件 过滤器GUID:…...
代码练习2.3
终端输入10个学生成绩,使用冒泡排序对学生成绩从低到高排序 #include <stdio.h>void bubbleSort(int arr[], int n) {for (int i 0; i < n-1; i) {for (int j 0; j < n-i-1; j) {if (arr[j] > arr[j1]) {// 交换 arr[j] 和 arr[j1]int temp arr[…...
基于 Redis GEO 实现条件分页查询用户附近的场馆列表
🎯 本文档详细介绍了如何使用Redis GEO模块实现场馆位置的存储与查询,以支持“附近场馆”搜索功能。首先,通过微信小程序获取用户当前位置,并将该位置信息与场馆的经纬度数据一同存储至Redis中。利用Redis GEO高效的地理空间索引能…...
【大数据技术】案例01:词频统计样例(hadoop+mapreduce+yarn)
词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…...
Selenium 使用指南:从入门到精通
Selenium 使用指南:从入门到精通 Selenium 是一个用于自动化 Web 浏览器操作的强大工具,广泛应用于自动化测试和 Web 数据爬取中。本文将带你从入门到精通地掌握 Selenium,涵盖其基本操作、常用用法以及一个完整的图片爬取示例。 1. 环境配…...
笔试-排列组合
应用 一个长度为[1, 50]、元素都是字符串的非空数组,每个字符串的长度为[1, 30],代表非负整数,元素可以以“0”开头。例如:[“13”, “045”,“09”,“56”]。 将所有字符串排列组合,拼起来组成…...
Java序列化详解
1 什么是序列化、反序列化 在Java编程实践中,当我们需要持久化Java对象,比如把Java对象保存到文件里,或是在网络中传输Java对象时,序列化机制就发挥着关键作用。 序列化:指的是把数据结构或对象转变为可存储、可传输的…...
ChatGPT与GPT的区别与联系
ChatGPT 和 GPT 都是基于 Transformer 架构的语言模型,但它们有不同的侧重点和应用。下面我们来探讨一下它们的区别与联系。 1. GPT(Generative Pre-trained Transformer) GPT 是一类由 OpenAI 开发的语言模型,基于 Transformer…...
MySQL入门 – CRUD基本操作
MySQL入门 – CRUD基本操作 Essential CRUD Manipulation to MySQL Database By JacksonML 本文简要介绍操作MySQL数据库的基本操作,即创建(Create), 读取(Read), 更新(Update)和删除(Delete)。 基于数据表的关系型…...
Redis背景介绍
⭐️前言⭐️ 本文主要做Redis相关背景介绍,包括核心能力、重要特性和使用场景。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
