力扣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),只开了一个辅助数组,来记录后缀最大

猜你喜欢

转载自blog.csdn.net/qq_45678698/article/details/120495418
今日推荐