排好序后用滑动窗口的思想。左标记从0开始,直到右标记无法再前进,此时让左标记前进,不断地调整框的大小,也在此过程中记录下框的大小
排序好一方面更容易获取最大值,而且也考虑了所有的可能。
class Solution { public: int maxFrequency(vector<int>& nums, int k) { long long window=0; //因为11行的操作 测试用例 会出现9999*9999 int l=0;//框的左标记 int j=1;//右标记 int max_res=1;//结果值 sort(nums.begin(),nums.end()); while(j<nums.size()) { window+=(long long)(nums[j]-nums[j-1])*(j-l);//可以理解为window使得现有的滑动框内的值均为nums[j-1],现在来了nums[j],那相当于每个都加一个nums[j]-nums[j-1] while(window>k) { window-=nums[j]-nums[l]; l++;//左标记右移 } max_res=max(max_res,j-l+1); j++; } return max_res; } };