好久没打力扣周赛了,今天做了下,以前都是可以肝三个题的,今天第二题就卡住了😭😭😭
下面我就浅浅分析下这个题吧,我一定能给你讲明白的😀😀😀
我们先来康康题目的意思啦,为了方便观看,我直接到力扣那里截了个屏过来✅
划重点
这道题免费哟,直接上链接🥰🥰🥰:数组的最大美丽值
题目都看完了吧?
我们现在来聊聊这道题的思路
思路
这道题如果采用常规的暴力法去做的话,是肯定的会TLE(超时)的,别问怎么知道的,因为尝试过了😤😤😤,其实看看这数据范围也知道,暴力法会超时~
那我们可以怎么优化呢,且听我徐徐道来
重点:我们对数组从小到大排序一下(这个其实并不会影响我们找题目中说的美丽值,因为需要找的是相同元素的子序列的长度嘛,所以即使排序了肯定也没影响啦)
😀好滴,排序完了后,我们开始浅浅分析一波
因为数组中任何的一个数x,可以是x-k 到 x+k 区间中的数,我们的目标是在数组中能够通过改变元素的值从而获得更多相等的数
因为在[x-k,x+k]区间的数都可以变成x,那么,我们可以得出一个结论,若数组中任何一个元素和最小的那个元素的差值都<=2*k的话,那么这个数组中的每个元素都能改变成x
相信你一定看懂了吧,没看懂可以在回味一下
好了,我们接下来就开始coding
时间复杂度:nlogn
class Solution { public: int maximumBeauty(vector<int>& nums, int k) { //获取长度 int len = nums.size(); //排序,方便处理 sort(nums.begin(),nums.end()); // r是右指针,ans记录最终的答案 int r=0,ans=0; for(int i=0;i<len;i++){ //这里 nums[r]-nums[i] <= 2*k 就是题解中说的,数组中任何一个元素和最小的那个元素的差值都<=2*k //nums[i] 一定是[i,r]区间中最小的,因为排序了的,所以这就是为什么要排序的原因 while(r<len&&nums[r]-nums[i]<=2*k){ r++; } // r-i 就表示数组中 [r,i]这个区间的数都能变成相等的,我们这里是需要求长度,所以直接r-i // 在所有区间中,取最大的那个长度 ans=max(ans,r-i); } return ans; } };
OKOK,题解完毕,这道题算是比较经典了,结合注释相信大家都看懂了吧,看懂了的掌声响起来😋,若还有不懂的地方,也是可以录制视频来讲解的额(掌声响起来😍)