力扣 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