594 最长和谐子序列

                                                                                                                                        点击此处返回总目录

 

【题目】

 

【分析】

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

 

【方法一:使用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)的算法快。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值