zoukankan      html  css  js  c++  java
  • 最长和谐子序列(力扣第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;
        }
  • 相关阅读:
    软件 = 程序 + 软件工程(构建之法读书笔记一)
    网站系统开发需要掌握的技术
    C++迪杰斯特拉算法求最短路径
    strcpy函数在VS2015无法使用的问题
    C++哈夫曼树编码和译码的实现
    java学习中一些疑惑解答(2)
    凯撒加密、解密算法
    利用DOS批处理实现定时关机操作
    C及C++中typedef的简单使用指南
    java学习中的一些疑惑解答
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13780766.html
Copyright © 2011-2022 走看看