题目
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。
示例
输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
说明: 输入的数组长度最大不超过20,000.
解题思路
遍历整个数组,用哈希表统计每个数出现的个数,同时比较当前数和比它大1或者小1的数的总个数,返回比较后的最大值即可。
代码
class Solution {
public int findLHS(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
int ans = 0;
for(int num : nums){
map.put(num,map.getOrDefault(num,0)+1);
if(map.containsKey(num-1)){
ans = Math.max(ans,map.get(num)+map.get(num-1));
}
if(map.containsKey(num+1)){
ans = Math.max(ans,map.get(num)+map.get(num+1));
}
}
return ans;
}
}
复杂度分析
- 时间复杂度: O ( N ) O(N) O(N),其中 N N N是数组的长度。
- 空间复杂度: O ( N ) O(N) O(N),用来存储整个数组。