LeetCode 594. 最长和谐子序列
对于子序列问题,首先想到排序+滑动窗口。
代码如下:
class Solution {
public:int findLHS(vector<int>& nums) {sort(nums.begin(), nums.end());int n = nums.size(), ans = 0;int i = 0, j = 0;while(j<n){while(i<j && nums[j] - nums[i] > 1) i++;// 保持窗口 [i..j] 内最大值与最小值之差 ≤ 1if(nums[j] - nums[i] == 1) ans = max(ans, j - i + 1);// 符合条件则更新 ansj++;}return ans;}
};
关于这题还有一种思路。我们可以观察到,满足条件的子序列都仅含有 i 和 i+1 两种数字,那么我们可以考虑统计每个数字的出现频次 cnt ,遍历 cnt ,令 ans = max(ans, cnt[i] + cnt[i+1])。
代码如下:
class Solution {
public:int findLHS(vector<int>& nums) {map<int, int> mp; // 记录频次for(auto i : nums){mp[i]++;}int ans = 0;for(auto i : mp){if(mp.contains(i.first+1)){ans = max(ans, i.second+mp[i.first+1]);}}return ans;}
};