力扣260场周赛第一题(5881)

第七十一天 --- 力扣260场周赛第一题(5881)

前言:送给一起刷题的朋友的建议

说实话,我认为力扣里面的简单题,一定要认认真真的研究,因为这种题一般难度不大,但是技巧性极强。可能暴力一下子就过了,是简单,但是暴力解法的话就失去了编程思考的乐趣,和进步的可能,无论何时我们在编程时候,都要以一种学习进步,思考的态度去进行,而不是一种刷题的态度,“过了就行”,我认为是编程路上最大的绊脚石,我们一定要养成:无论题目简单与否,都要追求自己能够优化的极限,尽自己最大可能的思考,不要泛泛而过,在不断优化中体会编程之美。

题目一

力扣:5881

在这里插入图片描述
在这里插入图片描述

思路

(暴力解法诸君一定都会,我这里就略过,我这里仅介绍自己研究出的O(N)的解法)
1、如果本题只让求出最大最小差值,则很简单,但是这道题有一个次序要求,就是:nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。
2、所以,任意一个元素只能向右找,在右面找到一个最大的元素,二者做差,所有差值中找最大
3、该元素只需要知道它右面最大的元素是谁就行,完全没必要知道确切未知,并且二者相对位置关系也是固定的符合题意的,所以
5、综上所述,用后缀最大的方法即可。

代码:

1、后缀最大:
tmp[i]=x表示从第i位到最后一位这个范围内最大的数是x

class Solution {
public:
	int maximumDifference(vector<int>& nums) {
		int tmp[1500];//求后缀最大的数组
		int ans = -1;
		int n = nums.size() - 1;
		tmp[n] = nums[n];
		for (int i = n - 1; i >= 0; i--) {//求后缀最大
		//即tmp[i]=x表示从第i位到最后一位这个范围内最大的数是x
			tmp[i] = max(nums[i], tmp[i + 1]);
		}
		for (int i = 0; i < n; i++) {
			int tmps = tmp[i + 1] - nums[i];//注意千万别减反了,理论上是后面比前面大,所以是后减前
			if (tmps <= 0) {//差值为负一定不是我们要的,我们要的是最大,一定是正数
				continue;
			}
			else {
				ans = max(ans, tmps);
			}
		}
		return ans;
	}
};


(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):
在这里插入图片描述

时间复杂度:O(N),只需要两次遍历数组即可完成求解
空间复杂度:O(N),只开了一个辅助数组,来记录后缀最大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JLU_LYM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值