题目:
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。
示例:
输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
分析:
首先要了解什么是子序列?
子序列:去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的新序列。即子序列中的元素不要求在原始字符序列中是连续的串。
根据和谐数组的定义可以知道,一个和谐子序列中能够出现且必须出现的元素只有两种,并且这两种元素的差值为1,否则就不是和谐的序列。那么可以借助于哈希表来解决这个问题,以数组中的元素值作为哈希表的key,相同元素在数组中出现的次数作为对应key的value值进行存储,这样原始数组中有多少个不同数值的元素,则对应哈希表中就会有多少个key,求最长的和谐子序列的长度就是可以分为两个步骤(先定义一个变量用于记录最长和谐子序列的长度):
1、对于当前访问的key,判断哈希表中key+1的键是否存在,如果存在,则进行第二步,如果不存在,进行下一个key的遍历;
2、将当前访问的key的对应的value值取出与key+1对应的value值相加,然后与当前最长和谐序列的长度比较,取最大值,然后进行下一个key的遍历访问。
代码:
public int findLHS(int[] nums) { if (nums == null || nums.length == 0){ return 0; } int maxLength = 0; HashMap<Integer, Integer> map = new HashMap<>(); for (int num : nums) { map.put(num,map.getOrDefault(num,0) + 1); } for (Integer key : map.keySet()) { if (map.get(key + 1) != null){ maxLength = Math.max(maxLength,map.get(key) + map.get(key + 1)); } } return maxLength; }