1、题目描述
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
2、算法分析
本题使用的是双指针解法,首先对数组元素进行排序。定义第一个指针指向的是数组的第一个元素。
for循环进行遍历数组,while(nums[end]-nums[start] > 1)的时候,start++,说明两数之间的大小已经大于1了。
if(nums[end] - nums[start] == 1)的话,说明符合题意。并计算两数之间的范围,end-start+1;
具体看下图:下图下标从1开始了,尴尬,大家看的时候数组下标从0开始。
3、代码实现
import java.util.*;
class Solution {
public int findLHS(int[] nums) {
// 先对数组进行排序
Arrays.sort(nums);
// 双指针的第一个之战的index下标
int start = 0;
// 计数,
int count = 0;
// end是第二个指针的下标index,end往后走
for(int end = 0;end < nums.length;end++){
// 因为数组中的元素是升序的,所以如果nums[end] - nums[start] > 1的话,start++,缩小范围
while((nums[end] - nums[start]) > 1){
start++;
}
// 如果num[end] - num[start] == 1,求出end-start+1的范围,然后每次都取最大的并赋值给count
if(nums[end] - nums[start] == 1){
count = Math.max(count,end-start+1);
}
}
return count;
}
}