LeetCode热题100|128.最长连续序列,283.移动零

128.最长连续序列

题目链接:128. 最长连续序列 - 力扣(LeetCode)

这里要求的一个乱序的数组里连续数字的个数,比如【100 ,4,200,1,3,2】

里面连续的数字就是【1,2,3,4】返回4

可以用排序,就是把他排成【1,2,3,4,100,200】然后挨个遍历,如果是相同的数就跳过,连续的数就计数,不连续的数就重置max_length

但是排序因为用到了sort最少也要O(nlogn)的复杂度,所以考虑哈希表O(1)

cpp 复制代码
class Solution {//排序的做法
public:
    int longestConsecutive(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int max_length=1;
        int current_length=1;
        for(int i=0;i<nums.size();i++){
            if(i>0&&nums[i]==nums[i-1]){
                continue;//相同的数
            }
            else if(i>0&&nums[i]==nums[i-1]+1){
                current_length++;//连续的数
            }
            else{
                max_length=1;//不连续的数,重置最大连续数的值
            }
            max_length=max(max_length,current_length);
        }
        return max_length;
    }
};

哈希表的做法就是先把他们放到一个set集合里面,这里可以进行去重,虽然去不去重不影响【1,1,2】和【1,2】因为算出来的最长连续子序列都是2,只是有点浪费资源,顺便去一下也可以。

这里的思路就是

1、把所有数组存到哈希组合

2、从起点扩展序列

如果【100 ,4,200,1,3,2】里面 遍历到3就会跳过,因为3-1=2,2在集合里面

遍历到100就会进入到条件里面,然后就会依次寻找他的连续序列,比如这里会找101,发现没有就只好跳过了

3、更新最长连续序列的值

cpp 复制代码
class Solution {//哈希做法
public:
    int longestConsecutive(vector<int>& nums) {
        unordered_set<int> num_set(nums.begin(),nums.end());
        int max_length=0;
        for(int num:nums){
            if(num_set.find(num-1)==num_set.end()){//数的前一位不在集合里,该数是扩展起点
                int current_length=1;
                int current_num=num;
                while(num_set.find(current_num+1)!=num_set.end()){//该数的下一位在集合里
                    current_length++;
                    current_num++;//更新该数
                }
                max_length=max(current_length,max_length);//更新最长连续序列
                
            }
        }
        return max_length;
    }
};

283.移动零

题目链接:283. 移动零 - 力扣(LeetCode)

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int left=0;
        for(int right=0;right<nums.size();right++){
            if(nums[right]){
                swap(nums[right],nums[left]);
                left++;
            }
        }
    }
};

用的是双指针法,过程就是:

right=0时,一进来,nums[right]为0,不进入if语句,每轮right照常++

right=1时,nums[right]不为0,进入if语句,交换left指向和right指向的值,left指针++

每轮right照常++

right=2时,nums[right]为0,不进入if语句,每轮right照常++

right=3时,nums[right]不为0,进入if语句,交换 交换left指向和right指向的值,left指针++

每轮right照常++

right=4时,nums[right]不为0, 进入if语句,交换 交换left指向和right指向的值,left指针++

right照常++为5,退出循环

相关推荐
Orlando cron6 分钟前
源哈希(sh)解析
负载均衡·哈希算法
Y1nhl1 小时前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
Swift社区4 小时前
Swift 解 LeetCode 320:一行单词有多少种缩写可能?用回溯找全解
开发语言·leetcode·swift
YuTaoShao14 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
百年孤独_1 天前
LeetCode 算法题解:链表与二叉树相关问题 打打卡
算法·leetcode·链表
算法_小学生1 天前
LeetCode 75. 颜色分类(荷兰国旗问题)
算法·leetcode·职场和发展
运器1231 天前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
算法_小学生1 天前
LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)
数据结构·算法·leetcode
岁忧1 天前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
alphaTao1 天前
LeetCode 每日一题 2025/6/30-2025/7/6
算法·leetcode·职场和发展