博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
594 最长和谐子序列
阅读量:3594 次
发布时间:2019-05-20

本文共 1077 字,大约阅读时间需要 3 分钟。

                                                                                                                                       

 

【题目】

 

【分析】

这个题难倒是不难,关键要效率。

 

【方法一:使用HashMap】

首先遍历一遍数组,将<num, num出现次数>保存到HashMap中。

然后遍历HashMap中的key,如果key+1也存在。就可以求出key和key+1对应的值之和。

 

代码:

结果:

 

我看到别人用这个方法,最好的效果能到46ms。我没有跑出来。而且我把别人46ms的代码拿过来,我还是跑了80多ms。

我猜测可能是leetCode改了测试用例之类的吧。

 

 

【方法二:双指针】

先排序,然后用双指针遍历。

比如:排序后为1 1 2 2 2 3 3 5 7

 

1. 初试两个指针i、j,开始时都指向0。

                                          

2. num[j]==num[i],j往后移:

                                            

3. num[j]==num[i],j往后移:

                                            

4. num[j]==num[i]+1,更新最大长度。res = max(res, j-i+1 ) = 3。j往后移:

                                             

5. num[j]==num[i]+1,更新最大长度。res = max(res, j-i+1 ) = 4。j往后移:

                                            

6. num[j]==num[i]+1,更新最大长度。res = max(res, j-i+1 ) = 5。j往后移:

                                           

7. num[j]>num[i]+1,i往后移:

                                            

8. num[j]>num[i]+1,i往后移:

                                            

9. num[j]==num[i]+1,更新最大长度。res = max(res, j-i+1 ) = 5。j往后移:

                                            

10. num[j]==num[i]+1,更新最大长度。res = max(res, j-i+1 ) = 5。j往后移:

                                            

11. num[j]>num[i]+1,i往后移:

                                            

 

12. num[j]>num[i]+1,i往后移:

                                             

 

13. num[j]>num[i]+1,i往后移:

                                              

14. num[j]>num[i]+1,i往后移:

                                              

15. num[j]>num[i]+1,i往后移:

                                              

16. num[j]==num[i],j往后移:

                                              

17. num[j]>num[i]+1,i往后移:

                                             

18. num[j]==num[i],j往后移:

                                             

19. 结束。

 

 

代码:

 

简化一下:

 

 

结果:

 

 

 

 

 

虽然方法二的结果比方法一要好,但是并不一定。方法一的时间复杂度为o(n),方法二的时间复杂度为o(nlogn)。可能是由于测试事例的问题,或者由于方法一取数置数的操作太多,导致运行慢了。但是基因决定了方法一优于方法二。

 

通过128,我们也看到这个奇怪的现象。o(n)的算法慢,先排序统计的o(nlogn)的算法快。

 

 

 

转载地址:http://bslwn.baihongyu.com/

你可能感兴趣的文章
Map、Set、List集合区别(看完秒懂)
查看>>
普通用户使用docker命令遇到提示需要提升权限时的解决方法
查看>>
webpack打包技术
查看>>
Leecode 面试题09用两个栈实现队列
查看>>
fastdfs连接超时报错解决方案
查看>>
Leecode202. 快乐数
查看>>
windows10解决80端口被占用的问题
查看>>
ElasticSearch快速入门之创建索引库、创建映射、创建文档、搜索文档
查看>>
用故事巧妙帮助理解公钥和私钥的区别和联系
查看>>
application.properties 文件和 application.yml 文件区别以及加载顺序
查看>>
阿里云服务器安装docker,拉取常用的mysql,redis,nginx等镜像
查看>>
为什么timestamp到2038年就截止了?
查看>>
设计模式之适配器模式
查看>>
设计模式之工厂模式
查看>>
设计模式之原型模式
查看>>
设计模式之对象池模式
查看>>
设计模式之责任链模式 Java实例代码 + Tomcat责任链模式应用+安卓责任链模式应用
查看>>
设计模式之命令模式 Java实例讲解 + 线程池中的应用场景
查看>>
设计模式之 解释器模式 Java实例代码演示
查看>>
设计模式之迭代器模式
查看>>