LeetCode题练习与总结:最长和谐子序列--594

embedded/2025/1/31 17:18:21/

一、题目描述

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 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

解释:

最长和谐子序列是 [1,2][2,3] 和 [3,4],长度都为 2。

示例 3:

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

输出:0

解释:

不存在和谐子序列。

提示:

  • 1 <= nums.length <= 2 * 10^4
  • -10^9 <= nums[i] <= 10^9

二、解题思路

  1. 首先我们需要统计数组中每个数字出现的次数,可以使用哈希表来实现。
  2. 遍历哈希表,对于每个键值对,检查是否存在键值加一的情况。如果存在,那么这两个键值对可以构成和谐子序列。
  3. 计算这两个键值对对应的值的和,即为当前和谐子序列的长度。
  4. 更新最长和谐子序列的长度。
  5. 返回最长和谐子序列的长度。

三、具体代码

import java.util.HashMap;
import java.util.Map;class Solution {public int findLHS(int[] nums) {Map<Integer, Integer> count = new HashMap<>();for (int num : nums) {count.put(num, count.getOrDefault(num, 0) + 1);}int longest = 0;for (int key : count.keySet()) {if (count.containsKey(key + 1)) {longest = Math.max(longest, count.get(key) + count.get(key + 1));}}return longest;}
}

这段代码首先通过一个for循环统计数组中每个数字出现的次数,然后通过另一个for循环遍历哈希表,寻找和谐子序列并计算其长度,最后返回最长和谐子序列的长度。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 统计数组中每个数字出现的次数:我们遍历了整个数组一次,因此这一步的时间复杂度是 O(n),其中 n 是数组的长度。

  • 遍历哈希表并寻找和谐子序列:在最坏的情况下,我们需要遍历整个哈希表哈希表中可能包含与数组长度相同数量的键值对,因此这一步的时间复杂度也是 O(n)。

综合以上两步,总的时间复杂度是 O(n) + O(n) = O(n),即线性时间复杂度。

2. 空间复杂度
  • 哈希表存储数组中每个数字出现的次数:在最坏的情况下,如果数组中的所有数字都是不同的,那么哈希表的大小将与数组的长度相同,因此空间复杂度是 O(n)。

综上所述,代码的时间复杂度是 O(n),空间复杂度也是 O(n)。这里的 n 是输入数组的长度。

五、总结知识点

  • 哈希表(HashMap)

    • 使用 HashMap 来存储数组中每个数字出现的次数。
    • put 方法用于在哈希表中插入键值对。
    • getOrDefault 方法用于获取键对应的值,如果键不存在,则返回默认值。
  • 增强型 for 循环

    • 使用增强型 for 循环来遍历数组 nums 和哈希表的键集 count.keySet()
  • 条件判断

    • 使用 if 语句来检查哈希表中是否存在当前键值加一的情况。
  • 数学函数

    • 使用 Math.max 函数来更新最长和谐子序列的长度。
  • 数组的遍历

    • 通过 for 循环对数组进行遍历。
  • 键值对操作

    • 通过 containsKey 方法检查哈希表中是否存在特定的键。
  • 默认值处理

    • 使用 getOrDefault 方法处理哈希表中不存在的键,并为其设置默认值。
  • 整型变量操作

    • 对整型变量进行增加和比较操作。
  • 方法返回值

    • 使用 return 语句返回计算得到的最长和谐子序列的长度。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.ppmy.cn/embedded/158411.html

相关文章

Linux C++

一、引言 冯诺依曼架构是现代计算机系统的基础&#xff0c;它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时&#xff0c;理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的&#xff0c;包括程序的存储、执行和资源管理。这对于编写高效、可靠的…

在线课堂小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

计算机毕业设计Python+CNN卷积神经网络小说推荐系统 K-means聚类推荐算法 深度学习 Kears 小说数据分析 可视化 Scrapy爬虫 协同过滤

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力

摘要&#xff1a;随着全球化和数字化进程的加速&#xff0c;消费者需求日益呈现出碎片化和个性化的趋势&#xff0c;这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求&#xff0c;因此&#xff0c;物流企业必须积极引入大…

STM32标准库移植RT-Thread nano

STM32标准库移植RT-Thread Nano 哔哩哔哩教程链接&#xff1a;STM32F1标准库移植RT_Thread Nano 移植前的准备 stm32标准库的裸机代码&#xff08;最好带有点灯和串口&#xff09;RT-Thread Nano Pack自己的开发板 移植前的说明 本人是在读学生&#xff0c;正在学习阶段&a…

冬天适合养什么鱼?

各位鱼友们&#xff0c;冬天来了&#xff0c;是不是还在为养什么鱼而烦恼&#xff1f;别担心&#xff0c;今天就来给大家好好推荐一些适合冬天养的鱼&#xff0c;让你的水族箱在寒冷的冬天也能生机勃勃&#xff01; 一、金鱼&#xff1a;冬日里的“小暖男” 金鱼绝对是冬季养鱼…

【Linux】 冯诺依曼体系与计算机系统架构全解

Linux相关知识点可以通过点击以下链接进行学习一起加油&#xff01;初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石&#xff0c;其统一存储和顺序执行理念推动…

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv 一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库&#xff1a; 这里使用的是正点原子的ubuntu虚拟机&#xff0c;在他的虚拟机里面已经安装好了opencv的库。 二、…