LeetCode算法题-Longest Harmonious Subsequence(Java实现)
这是悦乐书的第270次更新,第284篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是594)。我们定义一个和谐数组是一个数组,其最大值和最小值之间的差值恰好为1。给定一个整数数组,在其所有可能的子序列中找到其最长的和谐子序列的长度。例如:
输入:[1,3,2,2,5,2,3,7]
输出:5
说明:最长的和谐子序列是[3,2,2,2,3]。
注意:输入数组的长度不会超过20,000。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
直接使用两层for循环,依次遍历元素,如果当前元素在数组中不存在与之值相差为1的数,标志flag就为false,那么此元素就不参与计算,反之存在,就把自己出现的次数与其值相差为1的元素的出现次数加起来,并且flag改为true,取最大值即可。
public int findLHS(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
int result = 0;
for(int i=0; i<nums.length; i++){
boolean flag = false;
int count = 0;
for (int j=0; j<nums.length; j++) {
if (nums[i] == nums[j]) {
count++;
} else if (nums[i] == nums[j]-1) {
flag = true;
count++;
}
}
if (flag) {
result = Math.max(result, count);
}
}
return result;
}
03 第二种解法
先对数组进行升序排序,借助Arrays.sort方法来实现,然后遍历数组的元素。
排完序后,可以先将两种特殊情况直接返回结果,如果排序后的数组第一个元素与最后一个元素值相等,直接返回0;如果数组第一个元素与最后一个元素值相差1,返回数组长度。
如果当前元素连续出现,我们需要先将其出现次数记录下来,使用变量preCount来存值,在遇到与其值相差为1的元素时,再将与其值相差为1的元素的出现次数记录下来,加上preCount的值,就表示此和谐数组的长度,再去与所有可能的和谐数组长度做比较取最大值。
如果当前元素不是连续出现,那么preCount的值就为1,表示当前元素只出现了一次,然后判断下一个元素是否与其值相差1,如果下一个元素符合条件,就找到该元素出现的次数,加上preCount的值,两次数之和与最大值取较大者。
public int findLHS2(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
Arrays.sort(nums);
if (nums[0] == nums[nums.length-1]) {
return 0;
}
if (nums[0] == nums[nums.length-1]-1) {
return nums.length;
}
int preCount = 1, result = 0;
for (int i = 0; i < nums.length; i++) {
int count = 1;
if (i > 0 && nums[i] - nums[i - 1] == 1) {
while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
count++;
i++;
}
result = Math.max(result, count + preCount);
preCount = count;
} else {
while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
count++;
i++;
}
preCount = count;
}
}
return result;
}
04 第三种解法
使用HashMap,以数组中的每个元素为key,其出现次数为value,然后遍历map中的每个key,如果map中含有比当前key值大1的key,那么将当前key所对应的value与当前key加1后所对应的value相加,就表示一组和谐数组,在所有可能的和谐数组中找出最大值即可。为了避免溢出,HashMap中的key的类型取Long。
public int findLHS3(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
int result = 0;
Map<Long, Integer> map = new HashMap<Long, Integer>();
for (long n : nums) {
map.put(n, map.getOrDefault(n, 0)+1);
}
for (long key : map.keySet()) {
if (map.containsKey(key+1)) {
result = Math.max(result, map.get(key)+map.get(key+1));
}
}
return result;
}
05 第四种解法
我们可以将上面的解法再精简下,变成一个循环。有一点需要注意,与当前元素能够组成和谐数组的数,可能比自己大1,也可能比自己小1,并且可能还在当前元素的后面出现,所以需要将两种情况都考虑进去。
public int findLHS4(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
HashMap<Long, Integer> map = new HashMap<Long, Integer>();
int result = 0;
for (long n: nums) {
map.put(n, map.getOrDefault(n, 0)+1);
if (map.containsKey(n+1)) {
result = Math.max(result, map.get(n) + map.get(n+1));
}
if (map.containsKey(n-1)) {
result = Math.max(result, map.get(n) + map.get(n-1));
}
}
return result;
}
06 小结
算法专题目前已日更超过四个月,算法题文章137+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Longest Harmonious Subsequence(Java实现)的更多相关文章
- LeetCode算法题-Longest Uncommon Subsequence I(Java实现)
这是悦乐书的第252次更新,第265篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第119题(顺位题号是521).给定一组两个字符串,您需要找到这组两个字符串中最长的不同 ...
- LeetCode算法题-Longest Continuous Increasing Subsequence(Java实现)
这是悦乐书的第286次更新,第303篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第154题(顺位题号是674).给定未排序的整数数组,找到最长连续增加子序列的长度.例如 ...
- LeetCode算法题-Longest Word in Dictionary(Java实现)
这是悦乐书的第303次更新,第322篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720).给出表示英语词典的字符串单词数组,找到单词中长度最长的单 ...
- LeetCode算法题-Longest Univalue Path(Java实现)
这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...
- 【LeetCode】594. Longest Harmonious Subsequence 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计次数 日期 题目地址:https://leetc ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Rotated Digits(Java实现)
这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...
- LeetCode算法题-Toeplitz Matrix(Java实现)
这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...
- LeetCode算法题-Flood Fill(Java实现)
这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...
随机推荐
- Elasticsearch索引原理
转载 http://blog.csdn.net/endlu/article/details/51720299 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计 ...
- 从锅炉工到AI专家(9)
无监督学习 前面已经说过了无监督学习的概念.无监督学习在实际的工作中应用还是比较多见的. 从典型的应用上说,监督学习比较多用在"分类"上,利用给定的数据,做出一个决策,这个决策在有 ...
- .NET应用加载容器Glue4Net
在写ASP.NET的应用的时候我们只需要把写好的WEB程序放到IIS即可,在更新的时候只需要把文件复制过去IIS就可以自动重新加载相关WEB程序.如果是写一些win服务程序或一个服务端应用程序就没有这 ...
- 聚类——FCM
聚类——认识FCM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.FCM概述 FCM算法是基于对目标函数的优化基础上的一种数据聚类方法.聚类结 ...
- 免费IPv6访问收费IPv4,校园网免流量
软件:马上6 介绍: “可以让用户在免费的IPv6网络环境,有具备访问收费的IPv4互联网内容的能力!节省校园网流量!使用马上6客户端软件之后可以访问的IPv4互联网的内容(包括视频.游戏.音乐.学习 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署
前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...
- windows下使用jenkins持续集成.net项目
前言 随着微服务的兴起,原先一个庞大的项目,被切分一个个功能独立的微服务,虽然使得业务系统的扩展性和维护性得到提升,但是也加大了维护人员的工作量.有的系统由成百上千个微服务组成,如果每次有修改,都要手 ...
- 补习系列(9)-springboot 定时器,你用对了吗
目录 简介 一.应用启动任务 二.JDK 自带调度线程池 三.@Scheduled 定制 @Scheduled 线程池 四.@Async 定制 @Async 线程池 小结 简介 大多数的应用程序都离不 ...
- opensuse使用zypper安装软件
安装软件(opensuse) opensuse 通过zypper可以方便的进行软件管理,类似centos的yum 软件. 命令参考 软件包操作 搜索软件 zypper search package 安 ...
- Docker系列09—Docker的系统资源限制及验证
本文收录在容器技术学习系列文章总目录 1.限制容器的资源 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源.Docker提供了控制容器可以使用多少内存或CPU的方法,设置 ...