📖本篇内容:leetcode每日一题 2016. 增量元素之间的最大差值 简单模拟 一题三解两做~
📑 文章专栏:leetcode每日一题《打卡日常》
📆 最近更新:2022年2月25日 leetcode每日一题 537. 复数乘法 简单的字符串模拟拼接问题
🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起
🙊本文目录👍
- 🙊写在前面🙊
- 题目
- 示例
- 提示
- 📝思路📝
- ⭐代码实现⭐
- 运行结果
- 🙊写在最后🙊
🙊写在前面🙊
今日早上在学校被冻醒了,说也是奇怪,昨天中午都被大太阳晒着都要出了汗,今天就冷的瑟瑟发抖,害,世事无常,大肠包小肠,不多说了,接着肝题啦~今天又是一道简单的模拟题,最近几天都是模拟,我怀疑过两天就是困难模拟题了!先不说了,今天这题一题三做。
题目
给你一个下标从 0 开始的整数数组 nums &#xff0c;该数组的大小为 n &#xff0c;请你计算 nums[j] - nums[i] 能求得的 最大差值 &#xff0c;其中 0 <&#61; i
返回 最大差值 。如果不存在满足要求的 i 和 j &#xff0c;返回 -1 。
示例
示例1&#xff1a;
输入&#xff1a;nums &#61; [7,1,5,4]
输出&#xff1a;4
解释&#xff1a;
最大差值出现在 i &#61; 1 且 j &#61; 2 时&#xff0c;nums[j] - nums[i] &#61; 5 - 1 &#61; 4 。
注意&#xff0c;尽管 i &#61; 1 且 j &#61; 0 时 &#xff0c;nums[j] - nums[i] &#61; 7 - 1 &#61; 6 > 4 &#xff0c;但 i > j 不满足题面要求&#xff0c;所以 6 不是有效的答案。
示例2:
输入&#xff1a;nums &#61; [9,4,3,2]
输出&#xff1a;-1
解释&#xff1a;
不存在同时满足 i
示例3&#xff1a;
输入&#xff1a;nums &#61; [1,5,2,10]
输出&#xff1a;9
解释&#xff1a;
最大差值出现在 i &#61; 0 且 j &#61; 3 时&#xff0c;nums[j] - nums[i] &#61; 10 - 1 &#61; 9 。
提示
n &#61;&#61; nums.length
2 <&#61; n <&#61; 1000
1 <&#61; nums[i] <&#61; 10^9
&#x1f4dd;思路&#x1f4dd;
本题考查知识点
- 思路1&#xff1a;
简单的暴力模拟AC
&#xff0c;直接一个双重for
循环就可以搞定
&#xff0c;但是这样的时间复杂度为 n^2
&#xff0c;违背了咱们的算法思想初衷&#xff0c;所以咱们再来进行对应优化。 - 思路2:
尝试着优化为单次循环的思路
&#xff0c; 优化为贪心的思路&#xff0c;由题咱们可以知道&#xff0c;i ,这样一来我们就可以假定判断当前所处位置时&#xff0c;最小的nums[i]
的值即作为min
&#xff0c;这样一来我们只需要计算当前所处位置的值 - 当前位置最小的nums[i] 的值
就可以获取最大的差值了
~
- 思路3&#xff1a;小付之前刷过剑指offer中的一道题——
155. 最小栈
思路也可以参考最小栈&#xff0c;多维护一个辅助栈
来进行求解答案数据&#xff0c;思路3和思路2本质相同
&#xff0c;但是实现的情况有不同
&#xff0c;这里可以进行参考。
⭐代码实现⭐
双重循环暴力AC
class Solution {public int maximumDifference(int[] nums) {int n &#61; nums.length;int max &#61; -1;for (int i &#61; 0 ; i< n ; i&#43;&#43;){for (int j &#61; i&#43;1;j<n;j&#43;&#43;){if (max < nums[j] - nums[i] && nums[i] < nums[j])max &#61; Math.max(nums[j] - nums[i],max);}}return max;}
}
单层循环贪心求解
class Solution {public int maximumDifference(int[] nums) {int n &#61; nums.length;int max &#61; -1;for (int i &#61; 0 ,min &#61; nums[0]; i< n ;i&#43;&#43;){if (nums[i] > min) max &#61; Math.max(nums[i] - min,max);min &#61; Math.min(min,nums[i]);}return max;}
}
辅助栈求解
class Solution {public int maximumDifference(int[] nums) {Stack<Integer> helpStack &#61; new Stack<>();helpStack.push(nums[0]);Stack<Integer> stack &#61; new Stack<>();int max &#61; -1;for (int num : nums){stack.push(num);helpStack.push(Math.min(num,helpStack.peek()));}while (!stack.isEmpty() ){max &#61; Math.max(stack.pop() - helpStack.pop(),max);}
运行结果
双重循环暴力AC
单层循环 贪心求解
辅助栈求解
&#x1f64a;写在最后&#x1f64a;
2022-2-26今天小付打卡了哦~
美好的日出 美好的山河
都因有你存在 而璀璨 耀眼