题目:
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
题目链接
思路 排序 + 中心扩散
将数组变成有序数组,当前i位置值 - i + 1位置的值为 -1 则表示是和谐数组,那么分别从i 和 i + 1向两边扩散寻找等于i和等与i+1的 既可以得到最大长度
代码
class Solution {
public int findLHS(int[] nums) {
int len = nums.length;
Arrays.sort(nums);
int max = 0;
for(int i = 0; i < len - 1 ;i++){
if(nums[i] - nums[i + 1] == -1){
int l = i - 1;
int r = i + 2;
while (l >= 0 && nums[l] == nums[i]){
l--;
}
while (r < len && nums[r] == nums[i + 1]){
r++;
}
max = Math.max(max,r - l - 1);
}
}
return max;
}
}
思路 哈希表
i ,j 的差为1,那么就是统计i和j的个数,先保存i的个数,在去查找i + 1的个数即可
代码
public int f2(int[] nums){
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num,map.getOrDefault(num,0) + 1);
}
int res = 0;
for (int num : nums) {
//不存在i+1的值就过
if (map.containsKey(num + 1)) {
res = Math.max(res,map.get(num + 1)+map.get(num));
}
}
return res;
}