原题
L00594最长和谐子序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
来源:力扣(LeetCode)
难度:简单
链接:https://leetcode-cn.com/problems/longest-harmonious-subsequence
解法
-
找最大最小差为1的最长子序列,我们可以理解为:
找i和i+1本身个数之和最多的! -
方式一:枚举遍历,统计所有数的个数,然后找出组合值最大的即可(组合值:i和i+1的各自个数(出现次数)之和);
-
方式二:借用哈希表,将i本身和i出现的次数,存入哈希表,然后在表中找符合条件的及组合值最大的!
方式二:哈希表
public class L00594LongestSonString {
public int findLHS(int[] nums){
/*找最大最小差为1的最长子序列,我们可以理解为:
找i和i+1本身个数之和最多的!
方式一:枚举遍历,统计所有数的个数,然后找出组合值最大的即可(组合值:i和i+1的各自个数(出现次数)之和);
方式二:借用哈希表,将i本身和i出现的次数,存入哈希表,然后在表中找符合条件的及组合值最大的!
*/
//方式二:哈希表
HashMap<Integer, Integer> cnt = new HashMap<>();
int res=0;//结果
//存入哈希表
for (int i:nums){
cnt.put(i,cnt.getOrDefault(i,0)+1);//getOrDefault:是map接口的方法,返回指定键映射到的值,如果此映射不包含键的映射,则返回 defaultValue
}
//找符合条件的
for (Integer key:cnt.keySet()){
if(cnt.containsKey(key+1)){//判断哈希表中是否存在比当前key大1的key,如果存在,则统计它两出现次数之和
res = Math.max(res,cnt.get(key)+cnt.get(key+1));
}
}
return res;
}
}