• Leetcode594:最长和谐子序列


    原文链接:594. 最长和谐子序列 - 力扣(LeetCode)


    题目

            和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是 1 。

            现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。

            数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

    示例 1:

    输入:nums = [1,3,2,2,5,2,3,7]
    输出:5
    解释:最长的和谐子序列是 [3,2,2,2,3]

    示例 2:

    输入:nums = [1,2,3,4]
    输出:2

    示例 3:

    输入:nums = [1,1,1,1]
    输出:0

    提示:

    1 <= nums.length <= 2 * 104
    -109 <= nums[i] <= 109

    方法一

    解题思路
    1、遍历第一次nums,使用hashmap,记录每一个值及其出现的次数
    2、遍历第二次,判断有没有符合题意的一组元素
    3、如果有就将他们出现的次数加起来,更新最大值

    时间:18ms 空间:42.7MB

    1. class Solution {
    2.     public int findLHS(int[] nums) {
    3.         Map map = new HashMap<>();
    4.         //第一次循环,将nums中每一个值及其出现的次数,存入map中
    5.         for(int temp : nums){
    6.             if(map.containsKey(temp)){
    7.                 map.put(temp,map.get(temp)+1);
    8.             }
    9.             else map.put(temp,1);
    10.         }
    11.         int res=0;
    12.         for(int ans : nums){
    13.             //判断有没有比当前元素大1的元素
    14.             //如果有,则将他们对应的value值相加
    15.             //然后更新最大值
    16.             if(map.containsKey(ans+1)){
    17.                 res = Math.max(res,map.get(ans)+map.get(ans+1));
    18.             }
    19.             //if判断完,继续判断下一个元素
    20.         }
    21.         return res;
    22.     }
    23. }


    方法二

    解题思路
    1、由于该题顺序不影响结果,所以可以先排序
    2、利用滑动窗口的思想,不断更新指针
    3、满足题意,右指针right+1
    4、不满足题意,找到满足题意的第一个左指针left

    时间:13ms 空间:41.8MB

    1. class Solution {
    2.     public int findLHS(int[] nums) {
    3.         //因为差值总为1,所以顺序不影响结果
    4.         Arrays.sort(nums);
    5.         int Maxres = 0,left=0,right=0;
    6.         while(right
    7.             //当差值为1时,更新结果
    8.             if(nums[right]-nums[left]==1){
    9.                 Maxres=Math.max(Maxres,right-left+1);  
    10.             }
    11.             //差值不为1时,找到能使差值为1或0的左指针left
    12.             else{
    13.                 while(nums[right]-nums[left]>1){
    14.                     left++;
    15.                 }
    16.             }
    17.             //更新右指针
    18.             right++;
    19.         }
    20.         return Maxres;
    21.     }
    22. }

  • 相关阅读:
    记一次react-hooks项目获取图表图片集合并生成pdf的需求
    12款SCADA软件功能比较
    docker问题解决记录
    App上架Apple App Store和Google Play流程
    java惠生活网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    python中如何实现多进程,用进程的优缺点有啥?
    学习JavaEE的日子 Day39 注解,反射
    grafana 安装
    《IP编址与路由:网络层的关键技术》
    win10中ros与ubuntu中ros通信
  • 原文地址:https://blog.csdn.net/qq_52726736/article/details/127735498