leetcode每日一题 2016. 增量元素之间的最大差值 简单模拟 一题三解两做

本文主要是介绍leetcode每日一题 2016. 增量元素之间的最大差值 简单模拟 一题三解两做,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📖本篇内容:leetcode每日一题 2016. 增量元素之间的最大差值 简单模拟 一题三解两做~

📑 文章专栏:leetcode每日一题《打卡日常》

📆 最近更新:2022年2月25日 leetcode每日一题 537. 复数乘法 简单的字符串模拟拼接问题

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊本文目录👍

  • 🙊写在前面🙊
  • 题目
    • 示例
    • 提示
    • 📝思路📝
    • ⭐代码实现⭐
    • 运行结果
  • 🙊写在最后🙊

🙊写在前面🙊

今日早上在学校被冻醒了,说也是奇怪,昨天中午都被大太阳晒着都要出了汗,今天就冷的瑟瑟发抖,害,世事无常,大肠包小肠,不多说了,接着肝题啦~今天又是一道简单的模拟题,最近几天都是模拟,我怀疑过两天就是困难模拟题了!先不说了,今天这题一题三做。

题目

给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。

返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。

示例

示例1:

输入:nums = [7,1,5,4]
输出:4
解释:
最大差值出现在 i = 1 且 j = 2 时,nums[j] - nums[i] = 5 - 1 = 4 。
注意,尽管 i = 1 且 j = 0 时 ,nums[j] - nums[i] = 7 - 1 = 6 > 4 ,但 i > j 不满足题面要求,所以 6 不是有效的答案。

示例2:

输入:nums = [9,4,3,2]
输出:-1
解释:
不存在同时满足 i < j 和 nums[i] < nums[j] 这两个条件的 i, j 组合。

示例3:

输入:nums = [1,5,2,10]
输出:9
解释:
最大差值出现在 i = 0 且 j = 3 时,nums[j] - nums[i] = 10 - 1 = 9 。

提示

n == nums.length
2 <= n <= 1000
1 <= nums[i] <= 10^9

📝思路📝

本题考查知识点

  • 思路1:简单的暴力模拟AC,直接一个双重for循环就可以搞定,但是这样的时间复杂度为 n^2,违背了咱们的算法思想初衷,所以咱们再来进行对应优化。
  • 思路2: 尝试着优化为单次循环的思路 , 优化为贪心的思路,由题咱们可以知道,i < j && nums[i] < nums[j],这样一来我们就可以假定判断当前所处位置时,最小的nums[i]的值即作为min,这样一来我们只需要计算当前所处位置的值 - 当前位置最小的nums[i] 的值就可以获取最大的差值了~
  • 思路3:小付之前刷过剑指offer中的一道题——155. 最小栈 思路也可以参考最小栈,多维护一个辅助栈来进行求解答案数据,思路3和思路2本质相同,但是实现的情况有不同,这里可以进行参考。

⭐代码实现⭐

双重循环暴力AC

class Solution {public int maximumDifference(int[] nums) {int n = nums.length;int max = -1;for (int i = 0 ; i< n ; i++){for (int j = i+1;j<n;j++){// 进行判定 需要进行修改最大差值的前提如题所给if (max < nums[j] - nums[i] && nums[i] < nums[j])max = Math.max(nums[j] - nums[i],max);}}return max;}
}

单层循环贪心求解

class Solution {public int maximumDifference(int[] nums) {int n = nums.length;// 初始化没有找到的情况下的结果int max = -1;// 进行遍历 ,并且设置初始位置的最小nums[i] 为第一个元素for (int i = 0 ,min = nums[0]; i< n ;i++){// 如果满足 当前元素的值 大于了 当前所处位置的最小nums[i] 则进行更新我们的最大差值if (nums[i] > min) max = Math.max(nums[i] - min,max);// 更新我们 当前位置的最小nums[i] min = Math.min(min,nums[i]);}return max;}
}

辅助栈求解

class Solution {public int maximumDifference(int[] nums) {// 初始化辅助栈Stack<Integer> helpStack = new Stack<>();helpStack.push(nums[0]);// 初始化数据栈Stack<Integer> stack = new Stack<>();int max = -1;// 初始化for (int num : nums){stack.push(num);helpStack.push(Math.min(num,helpStack.peek()));}while (!stack.isEmpty() ){// 获取判断差值max = Math.max(stack.pop() - helpStack.pop(),max);}// 这步是为了防止i < j 时将其赋值引起的最小差值if (max == 0)return -1;return max;}
}

运行结果

双重循环暴力AC
在这里插入图片描述

单层循环 贪心求解
在这里插入图片描述

辅助栈求解
在这里插入图片描述

🙊写在最后🙊

2022-2-26今天小付打卡了哦~

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

在这里插入图片描述

这篇关于leetcode每日一题 2016. 增量元素之间的最大差值 简单模拟 一题三解两做的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直