首页 > 编程学习 > Leetcode594:最长和谐子序列

Leetcode594:最长和谐子序列

发布时间:2022/11/8 4:08:31

原文链接: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

class Solution {
    public int findLHS(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        //第一次循环,将nums中每一个值及其出现的次数,存入map中
        for(int temp : nums){
            if(map.containsKey(temp)){
                map.put(temp,map.get(temp)+1);
            }
            else map.put(temp,1);
        }
        int res=0;
        for(int ans : nums){
            //判断有没有比当前元素大1的元素
            //如果有,则将他们对应的value值相加
            //然后更新最大值
            if(map.containsKey(ans+1)){
                res = Math.max(res,map.get(ans)+map.get(ans+1));
            }
            //if判断完,继续判断下一个元素
        }
        return res;
    }
}


方法二

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

时间:13ms 空间:41.8MB

class Solution {
    public int findLHS(int[] nums) {
        //因为差值总为1,所以顺序不影响结果
        Arrays.sort(nums);
        int Maxres = 0,left=0,right=0;
        while(right<nums.length){
            //当差值为1时,更新结果
            if(nums[right]-nums[left]==1){
                Maxres=Math.max(Maxres,right-left+1);  
            }
            //差值不为1时,找到能使差值为1或0的左指针left
            else{
                while(nums[right]-nums[left]>1){
                    left++;
                }
            }
            //更新右指针
            right++;
        }
        return Maxres;
    }
}

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式