题解 | #连续的牛群标签序列#
连续的牛群标签序列
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;
}
};
