128-最长连续序列
我的解:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 检查数组元素个数
int size = nums.size();
// 特判,若数组为空则直接返回
if(size == 0) return 0;
// 对数组排序
sort(nums.begin(),nums.end());
// 记录当前连续的最大值和当前连续的数字个数
int max = 0,cnt = 1;
for(int i=1;i<size;i++){
// 后项减前项为1,则连续
if(nums[i]-nums[i-1]==1) cnt++;
// 如果前后两个数字相同,则跳过本次循环
else if(nums[i]==nums[i-1]) continue;
// 若不同,则记录max以及重置cnt
else{
max = (cnt > max ? cnt : max);
cnt = 1;
}
}
// 对于最后一个元素相同的情况下还要特判一下
if(cnt > max) max = cnt;
return max;
}
};
时间:O(nlogn)
空间:O(1)
官方题解:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 创建一个无需集合
unordered_set<int> num_set;
// 遍历数组元素,并将其无序保存到num_set中,无需可以降低集合插入的时间复杂度
for (const int& num : nums) {
num_set.insert(num);
}
// 初始化最长序列的长度为0
int longestStreak = 0;
// 遍历该集合
for (const int& num : num_set) {
// 使用 count 方法判断 num - 1 是否存在于集合中。如果不存在,说明 num 是一个连续序列的起始点
// 由于这里使用的是集合,而集合采用哈希的方法存储,所以一般在常数时间内就能判断其是否存在在集合中
if (!num_set.count(num - 1)) {
int currentNum = num;
int currentStreak = 1;
while (num_set.count(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}
longestStreak = max(longestStreak, currentStreak);
}
}
return longestStreak;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-consecutive-sequence/solutions/276931/zui-chang-lian-xu-xu-lie-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间:O(n)
空间:O(n)
283.移动零
我的解:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int lastNonZeroIndex = 0; // 记录非零元素的位置
// 遍历数组
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != 0) {
nums[lastNonZeroIndex] = nums[i]; // 将非零元素移到前面
lastNonZeroIndex++;
}
}
// 填充零
for (int i = lastNonZeroIndex; i < nums.size(); i++) {
nums[i] = 0; // 将剩余位置填充为零
}
}
};
使用快慢指针的思想,遇到非零则快慢指针同时向后,遇到零快指针(i)向后。
时间:O(n)
空间:O(1)