解题思路
元素顺序对求最美值没有影响,可以先对数组进行排序。
假设选取的相同整数为
x
x
x,则数组元素能够改变到
x
x
x的元素值范围为:
[
x
−
k
,
x
+
k
]
[x-k, x+k]
[x−k,x+k]。所以如果能够在排序后的数组中找到最值差小于等于
2
k
2k
2k的最长连续子数组,其长度即为最大美丽值。
C++
下面双重会超时的。
class Solution {
public:
int maximumBeauty(vector<int>& nums, int k) {
int n = nums.size();
sort(nums.begin(), nums.end());
int res = 0;
int i = 0;
while (i < n){
for (int j = i; j < n; j++){
if (nums[j] - nums[i] <= 2*k){
res = max(res, j-i+1);
}
}
i++;
}
return res;
}
};
方法一:
然后利用滑动窗口的方法解决问题。
class Solution {
public:
int maximumBeauty(vector<int>& nums, int k) {
int n = nums.size();
sort(nums.begin(), nums.end());
int res = 0;
for (int i = 0, j = 0; i < n; i++){
while ((nums[i] - nums[j]) > 2*k){
j++;
}
res = max(res, i - j + 1);
}
return res;
}
};
Java
方法一:
class Solution {
public int maximumBeauty(int[] nums, int k) {
int n = nums.length;
Arrays.sort(nums);
int res = 0;
for (int i = 0, j = 0; i < n; i++){
while((nums[i] - nums[j] > 2*k)) j++;
res = Math.max(res, i - j +1);
}
return res;
}
}
Python
方法一:
class Solution:
def maximumBeauty(self, nums: List[int], k: int) -> int:
res, j, n = 0, 0, len(nums)
nums.sort()
for i in range(n):
while nums[i] - 2*k > nums[j]:
j += 1
res = max(res, i - j + 1)
return res