LeetCode 594.最长和谐子序列(简单)_删除元素

题目描述

LeetCode 594.最长和谐子序列(简单)_子序列_02


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

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

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

LeetCode 594.最长和谐子序列(简单)_删除元素

示例 1

LeetCode 594.最长和谐子序列(简单)_子序列_02

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

LeetCode 594.最长和谐子序列(简单)_删除元素

示例 2

LeetCode 594.最长和谐子序列(简单)_子序列_02

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

LeetCode 594.最长和谐子序列(简单)_删除元素

示例 3

LeetCode 594.最长和谐子序列(简单)_子序列_02

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

LeetCode 594.最长和谐子序列(简单)_删除元素

提示

LeetCode 594.最长和谐子序列(简单)_子序列_02

  • 1 <= nums.length <= 2 *
  • - <= nums[i] <=

LeetCode 594.最长和谐子序列(简单)_删除元素

题目分析

LeetCode 594.最长和谐子序列(简单)_子序列_02

这道题读懂题目就会觉得比较简单,重点要理解 可以通过删除一些元素或不删除元素、且不改变其余元素的顺序 这句话,这句话说的是可以把数组中的一些不需要的元素删掉,说简单点就是改变数组的顺序对结果是没有影响的,所以千万别被最后 不改变其余元素的顺序 给骗了。这里我们可以使用哈希表解决这个问题,遍历整个数组,如果哈希表中没有 key 是当前遍历到的元素时,就添加该 key 且对应的值为 1 ;如果存在该 key 则获取原来 key 对应的 value 值加上一覆盖原来的 value 。最后遍历所有 key ,如果 key + 1 存在,则取 key 和 key + 1 对应的 value 值相加,即所谓的和谐子序列长度,并与之前存在的和谐子序列长度相比较,更新和谐子序列长度最大值返回即可。

LeetCode 594.最长和谐子序列(简单)_删除元素

题解

LeetCode 594.最长和谐子序列(简单)_子序列_02

执行用时: 15 ms

内存消耗: 43.3 MB

class Solution {
public int findLHS(int[] nums) {
// 创建哈希表
HashMap<Integer, Integer> map = new HashMap<>();
// 遍历数组 将元素作为 key 出现次数作为 value 添加进哈希表
for (int i : nums) {
// getOrDefault 方法
// 如果 map 中存在 key 为 i 则返回 key = i 对应的 value
// 如果 map 中不存在 key 为 i 返回 0
map.put(i, map.getOrDefault(i, 0) + 1);
}
// 返回的结果变量
int res = 0;
// 遍历 map 中的所有 key
for (int key : map.keySet()) {
// 如果 map 中存在 key + 1
if (map.containsKey(key + 1)) {
// 获取 key 和 key + 1 的 value 之和
// 取 res 和 value 之和 最大的一个更新 res
res = Math.max(res, map.get(key + 1) + map.get(key));
}
}
// 返回结果
return res;
}
}

题目来源:力扣(LeetCode)