【数组】【打卡92天】leetCode每日一题:594. 最长和谐子序列

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;
    }
}

おすすめ

転載: blog.csdn.net/Sunshineoe/article/details/121437826