题解 | #连续的牛群标签序列#
连续的牛群标签序列
https://www.nowcoder.com/practice/5db36ae74c274176a0cf9274e9f9ed3e
考察的知识点:哈希;
解答方法分析:
- 代码中定义了一个unordered_map<int, int> mp;用来存储标签的连续序列长度。其中,键为标签的值,值为该标签所在连续序列的长度。
- 通过for循环遍历给定的标签数组。
- 通过判断标签是否存在于哈希表中来判断标签是否重复。若标签在哈希表中不存在,则进行后续操作。避免重复处理相同的标签。
- 通过查找哈希表中前一个标签和后一个标签所在连续序列的长度,来计算当前标签所在连续序列的长度。若前一个标签存在,则取其连续序列的长度;若后一个标签存在,则取其连续序列的长度。加1即为当前标签所在连续序列的长度。
- 更新当前标签所在连续序列的长度,并更新序列的首尾标签所在连续序列的。同时,通过比较当前连续序列的长度和最长连续序列的长度,更新最长连续序列的长度。
- 遍历完标签数组后,最长连续序列的长度已经求得,将其返回。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param tag int整型vector * @return int整型 */ int longestConsecutive(vector<int>& tag) { unordered_map<int, int> mp; int longest = 0; for (int i = 0; i < tag.size(); ++i) { int num = tag[i]; if (mp.find(num) == mp.end()) { int left = mp.find(num - 1) != mp.end() ? mp[num - 1] : 0; int right = mp.find(num + 1) != mp.end() ? mp[num + 1] : 0; int curr = left + right + 1; mp[num] = curr; longest = max(longest, curr); mp[num - left] = curr; mp[num + right] = curr; } } return longest; } };