力扣刷题-热题100题-第3题(C、python)

128. 最长连续序列 - 力扣(LeetCode)https://leetcode.cn/problems/longest-consecutive-sequence/?envType=study-plan-v2&envId=top-100-liked

在编程中,集合(Set)是一个不允许重复元素的容器。集合中可以存储任何类型的元素,通常用于测试元素是否存在、去重等场景。在许多编程语言中都有集合的实现,如 Python、Java、C++ 等,同时对集合有直接的内嵌函数进行操作,但是c没有,所以这道题对于c来说主要用qsort函数对整个数组进行有序的排序后再进行处理,而对于Python、Java、C++这些编程语言可以直接使用集合这种数据结构用哈希法来解决这道题目。

1.常规法

先对数组进行排序,然后对排序好的数组进行遍历。先定义一个最大的连续序列数,然后遍历时记录当前的连续序列数的个数并不断与最大连续序列数进行比较,当前的连续序列数比最大的连续序列数大就把当前的连续序列数重新赋值给最大的连续序列数,遍历完成也就找到最大的连续序列数。

 c

【C语言】最长连续序列_最长连续自然数个数c语言-CSDN博客https://blog.csdn.net/GxySkywalker/article/details/136998430?ops_request_misc=%257B%2522request%255Fid%2522%253A%25229e15bc778c3dcd9594c2ec7248dcc694%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=9e15bc778c3dcd9594c2ec7248dcc694&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-136998430-null-null.142^v101^pc_search_result_base8&utm_term=%E6%9C%80%E9%95%BF%E8%BF%9E%E7%BB%AD%E5%BA%8F%E5%88%97c%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187

int compare(const void* elem1, const void* elem2) 
{
    return *(int*)elem1 - *(int*)elem2;
}
int longestConsecutive(int* nums, int numsSize)
{
    int p = 1;//当前最大连续序列数个数
    int h = 0;//全局最大连续序列数个数
    if(numsSize == 1)   return 1;
    if(numsSize == 0)   return 0;
//用qsort函数进行升序的快速排列
    qsort(nums, numsSize, sizeof(int), compare);
    for (int i = 0; i < numsSize-1; i++) 
    {
        if (nums[i] == nums[i + 1] - 1 )    p++;
        else if (nums[i] == nums[i + 1] )   p = p;//出现重复数字时
        else 
        {
            if (p > h)  h = p;//将此次连续序列数赋值给h,继续找是否有更大的
            p = 1;
        }
    }
    h = (p>h)?p:h;
    return h;
}

2.哈希法

先定义一个最大的连续序列数,第一层循环遍历数组中的每个数x,若数组中没有x-1,即x可以作为起点,然后在第二层遍历数组中找x+1、x+2...存在的当前的连续序列数,当前的连续序列数比最大的连续序列数大就把当前的连续序列数重新赋值给最大的连续序列数,遍历完成也就找到最大的连续序列数。

python

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        max1=0
        nums_set=set(nums)
        for num in nums_set:
            if num-1 not in nums_set:
                now_num=num
                now=1
                while now_num+1 in nums_set:
                    now_num=now_num+1
                    now=now+1
                max1=max(max1,now)
        return max1

你可能感兴趣的:(leetcode,算法,职场和发展)