目录
并查集定义
LeetCode128.最长连续序列
先去重再sort:
改进去重的方法:
参考:
并查集定义
在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构的操作:
Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。
Union:将两个子集合并成同一个集合。
由于支持这两种操作,一个不相交集也常被称为联合-查找数据结构(Union-find Data Structure)或合并-查找集合(Merge-find Set)。
为了更加精确的定义这些方法,需要定义如何表示集合。一种常用的策略是为每个集合选定一个固定的元素,称为代表,以表示整个集合。接着,Find(x)Find(x)Find(x) 返回 xxx 所属集合的代表,而 Union 使用两个集合的代表作为参数。
LeetCode128.最长连续序列
先去重再sort:
不满足O(N)复杂度的要求,但是却可以击败99%,离谱……
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if (nums.empty())
return 0;
int ans = 1, len = 0;
// 去重
unordered_set<int> s(nums.begin(), nums.end());
vector<int> v(s.begin(), s.end());
sort(v.begin(), v.end());
for (int i = 1; i < v.size(); i++) {
if (v[i] == v[i - 1] + 1) {
len++;
} else {
if (len == 0) {
continue;
} else {
ans = max(ans, len + 1);
len = 0;
}
}
}
// 进行到最后一个字符的时会出现统计疏漏,需要特别判断一下
if (len != 0) {
ans = max(ans, len + 1);
len = 0;
}
return ans;
}
};
改进去重的方法:
很快提高了空间复杂度!理论上时间复杂度是有提高的,但是LeetCode大数测试点肯定是有问题的……
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if (nums.empty())
return 0;
int ans = 1, len = 0;
sort(nums.begin(), nums.end());
for (int i = 1; i < nums.size(); i++) {
if (nums[i] == nums[i - 1]) // 改进去重的过程
continue;
if (nums[i] == nums[i - 1] + 1) {
len++;
} else {
if (len == 0) {
continue;
} else {
ans = max(ans, len + 1);
len = 0;
}
}
}
// 进行到最后一个字符的时会出现统计疏漏,需要特别判断一下
if (len != 0) {
ans = max(ans, len + 1);
len = 0;
}
return ans;
}
};
参考:
- 力扣