594. 最长和谐子序列

题目:
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。

示例 1:
输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
说明: 输入的数组长度最大不超过20,000.

思路1:
莽就完事了,嵌套循环。
leetcode超时。

代码如下:

public int findLHS(int[] nums) {
        int max = 0;
        for (int i = 0; i < nums.length; i++) {
            int len = 0;
            // 是有包含差值为1
            boolean flag = false;
            for (int j = 0; j < nums.length; j++) {
                int abs = nums[j] - nums[i];
                if (abs == 1) {
                    flag = true;
                    len++;
                } else if (abs == 0) {
                    len++;
                }
            }
            max = flag ? Math.max(len, max) : max;
        }
        return max;
    }

思路2:
思路1的方式,时间复杂度O(N^2),超时。
先把字符归拢,并记录出现次数,存储到map中,key=i,val=count
遍历map的keyset,如果存在map.get(key + 1),那么此key的和谐子序列为map.get(key)+map.get(key+1)。
把每次的便利结果取最大值

代码如下:

public int findLHS1(int[] nums) {
        // 记录每个数出现的次数
        Map map = new HashMap();
        for (int i : nums) {
            map.put(i, map.getOrDefault(i, 0) + 1);
        }
        // 遍历每个key和key+1比较
        int max = 0;
        for (Integer key : map.keySet()) {
            if (map.containsKey(key + 1)) {
                max = Math.max(map.get(key) + map.get(key + 1), max);
            }
        }
        return max;
    }

-------------------------------小白学算法

你可能感兴趣的:(594. 最长和谐子序列)