其他分享
首页 > 其他分享> > 力扣 594. 最长和谐子序列

力扣 594. 最长和谐子序列

作者:互联网

题目

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

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

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

示例

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-harmonious-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1:排序 + 滑动窗口

因为没有规定递增递减,所以其实顺序是可以变得,因此可以先排序。
请添加图片描述

Java实现1

class Solution {
    public int findLHS(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length, ans = 0;
        for (int i = 0, j = 0; j < n; j++) {
            while (i < j && nums[j] - nums[i] > 1) i++;
            if (nums[j] - nums[i] == 1) ans = Math.max(ans, j - i + 1);
        }
        return ans;
    }
}
Java实现2

太复杂了- -!!!

class Solution {
    public int findLHS(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);

        int l = 0, r = l;
        int max = 0, min = 0, len = 0;

        while (l < n && r < n) {
            min = nums[l];
            max = nums[r];
            //找到满足max - min == 1的左边界和右边界
            while (r < n && max - min < 1) {
                r++;
                if (r < n) max = nums[r]; //注意这个边界问题
            }

            while (max - min == 1 && r < n) {
            	//更新长度
                len = Math.max(len, r - l + 1);

				//窗口右边界增加
                r++;
                if (r < n && nums[r] >= max) {
                    max = nums[r];
                }
            }
            //窗口左边界缩小
            l++;
        }
        return len;
    }
}

在这里插入图片描述

标签:594,nums,int,max,min,力扣,++,&&,序列
来源: https://blog.csdn.net/qq_42467009/article/details/121436654