leetcode
leetcode 2651 ~ 2700
最长和谐子序列

最长和谐子序列

难度:

标签:

题目描述

We define a harmonious array as an array where the difference between its maximum value and its minimum value is exactly 1.

Given an integer array nums, return the length of its longest harmonious subsequence among all its possible subsequences.

A subsequence of array is a sequence that can be derived from the array by deleting some or no elements without changing the order of the remaining elements.

 

Example 1:

Input: nums = [1,3,2,2,5,2,3,7]
Output: 5
Explanation: The longest harmonious subsequence is [3,2,2,2,3].

Example 2:

Input: nums = [1,2,3,4]
Output: 2

Example 3:

Input: nums = [1,1,1,1]
Output: 0

 

Constraints:

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

代码结果

运行时间: 240 ms, 内存: 17.8 MB


// 思路:
// 1. 使用Java Streams来构建一个哈希映射,记录每个数字的出现次数。
// 2. 使用Streams来遍历哈希映射,并寻找最长的和谐子序列长度。
// 3. 返回最大的和谐子序列长度。

import java.util.*;
import java.util.stream.*;

public class HarmoniousArrayStream {
    public int findLHS(int[] nums) {
        Map<Integer, Long> map = Arrays.stream(nums)
            .boxed()
            .collect(Collectors.groupingBy(e -> e, Collectors.counting()));
        return map.keySet().stream()
            .filter(key -> map.containsKey(key + 1))
            .mapToInt(key -> (int) (map.get(key) + map.get(key + 1)))
            .max()
            .orElse(0);
    }

    public static void main(String[] args) {
        HarmoniousArrayStream has = new HarmoniousArrayStream();
        int[] nums = {1, 3, 2, 2, 5, 2, 3, 7};
        System.out.println(has.findLHS(nums)); // 输出:5
    }
}

解释

方法:

这个题解使用了哈希表的思路。首先用 Counter 统计数组中每个数字出现的次数,然后遍历哈希表中的每个键值对。对于每个键 key,如果 key+1 也在哈希表中,就计算 key 和 key+1 出现次数之和,并更新结果 ret 为 ret 和这个和中较大的那个。最后返回 ret 即可。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
为什么选择使用哈希表来解决这个问题?哈希表在这里具体起到了什么作用?
哈希表被选择用于解决这个问题,因为它能以高效的方式存储和查找键值对,其中键是元素值,而值是该元素在数组中出现的次数。在这个问题中,我们需要频繁地查询某个数字及其相邻数字是否存在,以及它们的出现频次。使用哈希表,我们可以实现对这些信息的快速访问(平均时间复杂度为O(1)),这是因为哈希表提供了非常快的查找、插入和删除操作。总之,哈希表在这里主要起到了快速统计和检索数据的作用,从而允许我们高效地计算和谐子序列的长度。
🦆
在题解中,为什么只检查了key+1在哈希表中的存在,而没有考虑key-1的情况?
在题解中,只检查key+1而不是key-1的原因是为了避免重复计算。由于和谐子序列由数对 'key' 和 'key+1' 组成,如果我们同时检查 'key-1',那么每对相邻的数会被计算两次(一次作为 'key' 和 'key+1',一次作为 'key-1' 和 'key')。通过只查看 'key+1',我们可以确保每一对和谐子序列只被计算一次,从而提高算法的效率和避免不必要的重复计算。
🦆
如果哈希表中的键值对非常多,是否会影响算法的性能?具体来说,这种影响体现在哪些方面?
如果哈希表中的键值对非常多,确实会影响算法的性能。首先,哈希表的空间复杂度会增加,需要更多的内存来存储这些键值对。其次,虽然平均情况下哈希表的查找、插入和删除操作的时间复杂度为O(1),但在最坏情况下,这些操作的时间复杂度可能退化为O(n),尤其是在哈希冲突较多的情况下。此外,遍历哈希表的时间复杂度为O(n),其中n是键值对的数量,因此如果键值对非常多,遍历操作的开销也会增大。总之,键值对数量的增加,会在空间复杂度、时间复杂度和操作效率上带来影响。

相关问题