和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例 1:
输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
方法一:双指针
public int findLHS(int[] nums) { int len=nums.length; int begin = 0; int res =0; Arrays.sort(nums); for(int end =0;end<len;end++){ while(nums[end]-nums[begin]>1){ begin++; } if(nums[end]-nums[begin]==1){ res=Math.max(res,end-begin+1); } } return res; }
方法二:哈希表
public int findLHS(int[] nums) { Map<Integer,Integer> map =new HashMap<>(); for(int num:nums){ map.put(num,map.getOrDefault(num,0)+1); //计算每个数有多少个 } int res=0; for(int num:map.keySet()){ if(map.containsKey(num+1)) { //如果包含相差为1的数 res = Math.max(res, map.get(num + 1) + map.get(num)); //计算有多少个数 } } return res; }