思路:
第一步先将数组排序,在使用滑动窗口(同向双指针),定义 left
right
下标,比如这一组数 {1,3,2,2,5,2,3,7}
排序后 {1,2,2,2,3,3,5,7}
因为是排序过后的数组所以当前 right
就是当前区间(窗口)的最大值,而 left
就是当前区间(窗口)的最小值,nums[right] - nums[left] == 1
的话就更新当前窗口的长度并 ++right
,若 nums[right] - nums[left] > 1
让 left
向 right
靠近因为是升序数组,若 nums[right] - nums[left] < 1
则 ++right
。
代码:
class Solution {
public:
int findLHS(vector<int>& nums) {
// 排序
sort(nums.begin() , nums.end());
// 滑动窗口 同向双指针
int left = 0;
int right = 0;
int ans_length = 0;
while (right < nums.size()) {
// 升序数组 left就指向当前窗口的最小值
// right指向的是当前窗口的最大值
if (nums[right] - nums[left] > 1) {
// 差值大于1 让left 向 right 靠近
left++;
} else if (nums[right] - nums[left] < 1) {
// 差值小于1 让right++
right++;
} else {
// 当前窗口的最大值和最小值差是1
// 更新长度
ans_length = max(ans_length , right - left + 1);
right++;
}
}
return ans_length;
}
};