1、和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
【解题思路一】
先将数组排序,以为下标为j元素作为滑动窗口的右边界,下标为i的元素作为左边界,移动滑动窗口,统计最大值。
class Solution { public int findLHS(int[] nums) { Arrays.sort(nums); int ans = 0; int i = 0; for(int j = 0; j < nums.length; j++){ while(i < j && nums[j] - nums[i] > 1) i++; if(nums[j] - nums[i] == 1){ ans = Math.max(ans, j - i + 1); } } return ans; } }
【解题思路二】
遍历数组, 统计每个数字出现的次数,再次遍历数组,统计每个数x,x+1 和 x-1出现的次数,分别统计,然后取最大值。
class Solution { public int findLHS(int[] nums) { // Arrays.sort(nums); // int ans = 0; // int i = 0; // for(int j = 0; j < nums.length; j++){ // while(i < j && nums[j] - nums[i] > 1) i++; // if(nums[j] - nums[i] == 1){ // ans = Math.max(ans, j - i + 1); // } // } // return ans; HashMap<Integer, Integer> map = new HashMap<>(); int ans = 0; for(int i : nums){ if(map.containsKey(i)){ map.put(i, map.get(i) + 1); continue; } map.put(i, 1); } for(int i : nums){ if(map.containsKey(i + 1)){ ans = Math.max(ans, map.get(i) + map.get(i + 1)); } if(map.containsKey(i - 1)){ ans = Math.max(ans, map.get(i) + map.get(i - 1)); } } return ans; } }