leetcode 594. 最长和谐子序列 [java /排序+中心扩散 / 哈希表]

79 阅读1分钟

题目:

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

题目链接

594. 最长和谐子序列

思路 排序 + 中心扩散

将数组变成有序数组,当前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;
}