最长和谐子序列(力扣第594题)

题目:

  和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是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;
    }
原文地址:https://www.cnblogs.com/yxym2016/p/13780766.html