Java_20 元素和最小的山形三元组

元素和最小的山形三元组

给你一个下标从 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

我的解答

思路:先将整个数组从小到大排序,以确保元素和最小;在排序的过程中,也将其一开始对应的下标改变顺序

再进行一下条件判断

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

第一次排序算法写错了,出错

 修改后提交,依旧存在问题,没法百分百通过

class Solution {public int minimumSum(int[] nums) {int len=nums.length;int[] key=new int[len];int i=0,j=0,k=0,temp=0;for(i=0;i<len;i++){key[i]=i;}for(i=0;i<len-1;i++){//冒泡排序for(j=0;j<len-1-i;j++){if(nums[j]>nums[j+1]){temp=nums[j];nums[j]=nums[j+1];nums[j+1]=temp;temp=key[j];key[j]=key[j+1];key[j+1]=temp;}}}for(i=0;i<len;i++){for(j=0;j<len;j++){for(k=0;k<len;k++){if(nums[i]<nums[j]&nums[k]<nums[j]){if(key[i]<key[j]&key[j]<key[k])return nums[i]+nums[j]+nums[k];}}}}return -1;}
}

 

官方题解

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

力扣官方题解

方法一:枚举

思路与算法

我们直接按照题目的要求进行模拟,枚举所有三元组即可。

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

复杂度分析

  • 时间复杂度:O(n3)O(n^3)O(n3),其中 nnn 是数组的长度。
  • 空间复杂度:O(1)O(1)O(1)。
方法二:数组

思路与算法

我们从左到右遍历,来求出前缀数组中的最小值,用 left[i]\textit{left}[i]left[i] 来表示前 iii 个数字的最小值。

然后我们从右到左遍历,用 right\textit{right}right 来表示当前数字右边的最小值。
如果一个数比左右两边最小值大时,说明找到一个山形三元组,并更新当前山形三元组的最小元素和。

最后我们返回最小元素和即可。

class Solution {
public:int minimumSum(vector<int>& nums) {int n = nums.size(), res = 1000, mn = 1000;vector<int> left(n);for (int i = 1; i < n; i++) {left[i] = mn = min(nums[i - 1], mn);}int right = nums[n - 1];for (int i = n - 2; i > 0; i--) {if (left[i] < nums[i] && nums[i] > right) {res = min(res, left[i] + nums[i] + right);}right = min(right, nums[i]);}return res < 1000 ? res : -1;}
};

复杂度分析

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是数组的长度。
  • 空间复杂度:O(n)O(n)O(n),其中 nnn 是数组的长度。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577532.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用mybatis的@Interceptor实现拦截sql

一 mybatis的拦截器 1.1 拦截器介绍 拦截器是一种基于 AOP&#xff08;面向切面编程&#xff09;的技术&#xff0c;它可以在目标对象的方法执行前后插入自定义的逻辑。 1.2 语法介绍 1.注解Intercepts Intercepts({Signature(type StatementHandler.class, method “…

vue-devtools 不显示的问题

vue 项目中浏览器右上角可以显示出插件&#xff0c;但是控制台却没有显示。 项目中在main.js中添加设置devtools为trueVue.config.devtools true插件显示可以使使用&#xff0c;控制台没有显示VUE选项 项目使用了 externals 打包优化&#xff0c;使用了vue的压缩版本&#x…

Verilog语法之case语句学习

case分支语句是一种实现多路分支控制的分支语句。与使用if-else条件分支语句相比&#xff0c;采用case分支语句来实现多路控制会变得更加的方便直观。 case分支语句通常用于对微处理器指令译码功能的描述以及对有限状态机的描述。Case分支语句有“case”、“casez”、“casex”…

Django创建多app应用

目录 1. 引言 2. 多app创建的两种方式 2.1 多个app结构 2.2 单个apps多个app 3. 最后 1. 引言 在平常业务开发中&#xff0c;我们遇到的功能可能会有很多&#xff0c;单个app的应用可能无法满足我们 这个时候&#xff0c;我们就需要多app应用&#xff0c;例如&#xff1a…

[RAM] 图解 RAM 结构原理

主页&#xff1a; 元存储博客 文章目录 前言1. Channel2. Dimm3. Rank4. Bank5. Row6. Column7. Beat8. Burst Length总结 前言 从CPU至DRAM晶粒之间依据层级由大至小为channel>DIMM>rank>chip>bank>row/column。 图片来源&#xff1a; 电脑王 DRAM层级关系 DR…

区块链dapp开发 dapp系统开发方案

在区块链技术的兴起和普及的推动下&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;成为了当前数字世界中的热门话题之一。DApp 的开发不仅需要考虑技术方面的挑战&#xff0c;还需要深入了解区块链的工作原理和应用场景。本文将介绍一种 DApp 系统开发的基本方案&am…

SpringBoot登录校验(三)

​​​​​​​SpringBoot 登录认证&#xff08;一&#xff09;-CSDN博客 SpringBoot 登录认证&#xff08;二&#xff09;-CSDN博客 SpringBoot登录校验&#xff08;三&#xff09;-CSDN博客 前面我们介绍了传统的会话跟踪技术cookie和sesstion&#xff0c;本节讲解令牌技术…

Python数据分析必备工具——Pandas模块及其应用

Python数据分析必备工具——Pandas模块及其应用 外部数据的读取文本文件的读取语法示例 电子表格的读取语法示例 数据库数据的读取与操作语法 数据操作数据概述语法 数据筛选语法 数据清洗数据类型语法示例 沉余数据语法示例 异常值的识别与处理缺失值的识别与处理语法示例 数据…

Docker命令及部署Java项目

文章目录 简介Docker镜像镜像列表查找镜像拉取镜像删除镜像镜像标签 Docker容器容器启动容器查看容器停止和重启后台模式和进入强制停止容器清理停止的容器容器错误日志容器别名及操作 Docker部署Java项目 简介 Docker是一种容器化技术&#xff0c;可以帮助开发者轻松打包应用…

实时渲染是什么意思?实时渲染和离线渲染的区别

一、实时渲染是什么意思&#xff1f; 实时渲染是指在计算机程序运行时即时地生成图像和动画的过程&#xff0c;这种渲染技术通常用于网络游戏、虚拟现实和增强现实等需要实时交互的XR应用中。实时渲染需要在每秒内渲染数百万到数十亿个像素&#xff0c;以呈现出平滑的动画和交…

考研数学|武忠祥学习包搭配《660》和《880》

一、660、880、三大计算简单分析 660题 这本题册具有高难度、综合度和深度&#xff0c;属于高质量的题材。我建议不要在基础阶段就着手解决其中的660题&#xff0c;因为这可能会影响你的信心。相反&#xff0c;你可以在基础阶段完成一轮学习后&#xff0c;将这些题目留到强化…

从运营层面看财务管理:如何做好项目的财务预算

有效的项目运营是企业发展进步的主要活动&#xff0c;企业管理者的项目财务管理主要针对项目财务预算。项目财务预算管理是企业财务管理的一个分支&#xff0c;也是项目财务管理的核心部分&#xff0c;其表现形式为一个综合性的财务计划&#xff0c;主要包括预算编制、报告、执…