题目:594. 最长和谐子序列
题目:和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
方法1 HashMap
1、思路:用一个哈希映射来存储每个数出现的次数,这样就能得到 nums[x] 和 nums[x]+1 出现的次数。(nums[x] 和 nums[x]+1差值为1)
2、算法
(1) 遍历一遍数组,得到哈希映射
(2) 设当前遍历到的键值对为 (nums[x] ,value),那么我们就查询 nums[x]+1 在哈希映射中对应的统计次数,和谐子序列的长度等于nums[x] 和 nums[x]+1 出现的次数
3、java代码
import java.util.HashMap;
class Solution {
public int findLHS(int[] nums) {
//记录数组中元素出现次数
HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
//containsKey()方法:检查 hashMap 中是否存在指定的 key 对应的映射关系。
if(map.containsKey(nums[i])){
//replace()方法:替换 hashMap 中是指定的 key 对应的 value。
map.replace(nums[i],map.get(nums[i])+1);
continue;
}
map.put(nums[i],1);
}
int tempHS=0;
int res=0;
//keySet()方法返回映射中所有key组成的Set视图。
//keySet()方法可以与 for-each 循环一起使用,用来遍历迭代 HashMap 中的所有键。
for (int key : map.keySet()) {
//数组里元素的最大值和最小值之间的差别正好是1
//和谐数组条件:如果有两个key差值为1,则出现次数可相加
if (map.containsKey(key + 1)) {
res = Math.max(res, map.get(key) + map.get(key + 1));
}
}
return res;
}
}
*****************************
错解:
import java.util.Arrays;
import java.util.HashMap;
class Solution {
public int findLHS(int[] nums) {
//记录数组中元素出现次数
Arrays.sort(nums);
HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(nums[i])){
map.replace(nums[i],map.get(nums[i])+1);
continue;
}
map.put(nums[i],1);
}
int tempHS=0;
int res=0;
for(int i=1;i<nums.length;i++){
if(nums[i]==nums[i-1]) continue;
错误:原数组排序后相邻两元素差值不一定为1,出现次数不可相加
tempHS=map.get(nums[i])+map.get(nums[i-1]);
res=Math.max(res,tempHS) ;
}
return res;
}
}