原文链接: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
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
- //当差值为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;
- }
- }