LeetCode-697. Degree of an Array

来源:互联网 发布:intelij idea java web 编辑:程序博客网 时间:2024/06/06 02:37

Description:

这里写图片描述

Example 1:

这里写图片描述

Example 2:

这里写图片描述

Note:

这里写图片描述

Solution (C++):

这里写图片描述

算法分析:

其实仔细分析这道题,不难看出,如果真的去分析子序列,徒增烦恼。我们只要找到出现次数最多的那个数,还有它们的索引,然后找到它们索引中最小值与最大值,相减加一,就可以算出最小值索引与最大值索引之间的数的个数,这个就是我们要找到答案。如果相同的出现次数的数,那么就选择最短的那个,即可。
但对于我来说,问题的关键不在这,而在于,如果快速有效简便地找到这个序列中,出现次数最多的元素,并获得它们的索引呢?以我目前的认知,会采用桶排序。但是题目Note已经说了单个元素范围是0~49999,所以桶排序肯定不行。
那么参考优秀的别人的答案。可以用哈希表,Hash Table,来巧妙地解决这道题。这也确实反映了我,算法功底并不扎实。但这也正是我做题、写这些博客的目的—–通过不断的做题练习,来在实战中完成算法学习。所以,接下来,我会首先就这道题中的Hash Table的运用进行说明。然后,我会单独新开辟一个系列,系统的学习数据结构与算法。


这里用了两个哈希表,一个用来储存索引,一个用来计数。而两个哈希表共同的地方就是序列的元素值。那么,当储存了不同元素的索引,并得到了元素出现的次数之后,我们就能找到出现次数最多的元素,从而也能获得相同数值的其他元素的索引。
除此之外,还要注意到特殊情况,那就是某些特例,就跟数学中分类讨论一样,要考虑周全。在这道题中就是,如果序列的规模很小,序列长度只有一,就一个元素,那么我们直接返回1,就是符合题目要求的答案了。

程序分析:

首先要好好分析一下unordered_map这种数据结构。找到的目前觉得比较好的博客是:关联容器:unordered_map详细介绍。
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序。总之简单来说,unordered_map的两个参数,前一个是key,后一个是value。可以通过key来搜索到value。
那么回到具体的程序来说,startIndex的key就是nums[i],元素的数值;value是i,元素的索引。正好跟原nums[]反过来了。而count的key同样是nums[i],而value是记录元素重复出现的次数。


之前一直以为要先遍历nums一遍之后,才能让再从头再查找一变count,从中找到最大值。其实,这也是我的一种常用惯性思维。其实解决问题要学会重一般性入手。那么对于一般的情况。如果count[nums[i]]的值就是fre,那么这就是我们要找到的对象。如果count[nums[i]]大于当前fre,就进行fre的更新。