最长连续序列

复制代码
class Solution 
{
public:
    int longestConsecutive(vector<int>& nums)
     {
        sort(nums.begin(), nums.end());
//  for (int n : nums)
//      cout << n << " ";
//  cout << endl;

 int length = nums.size();
 int max = 0;
 if(length==0||length==1) return length;
 for (int begin = 0; begin < length-1; begin++)
 {
     int l = 1;
     int i = begin;
     for (int j = begin + 1; j < length; j++)
     {
         if ((nums[i] + 1 )== nums[j] )
         {
             //cout << i << " " << j << " " << l << " " << nums[i] << " " << nums[j] << endl;
             l++;
             i++;
            // j++; j已经+了没必要+
         }
           else if (nums[i] == nums[j])
  {
      i++;
  }
         else break;
     }
     if (max < l) max = l;
 }
return max;


    }
};

依旧复杂度问题

复制代码
class Solution 
{
public:
    int longestConsecutive(vector<int>& nums)
     {
        //    if (nums.empty()) return 0; // 处理空数组,避免后续访问越界
        
        // // 用哈希集合去重并加速查找
        // unordered_set<int> numSet(nums.begin(), nums.end());
    int length = nums.size();
        sort(nums.begin(), nums.end());
    // 处理特殊情况
    if (length <= 1) 
    {
        return length;
    }
    int max_len = 1;  // 最长连续序列长度,至少为1
    int current_len = 1;  // 当前连续序列长度
    // 遍历数组,从第二个元素开始
    for (int i = 1; i < length; i++)
     {
        // 如果当前元素与前一个元素相同,不增加长度
        if (nums[i] == nums[i - 1]) 
        {
            continue;
        }
        // 如果当前元素是前一个元素+1,说明连续
        else if (nums[i] == nums[i - 1] + 1) 
        {
            current_len++;
            // 更新最长长度
            if (current_len > max_len) 
            {
                max_len = current_len;
            }
        }
        // 序列中断,重置当前长度
        else 
        {
            current_len = 1;
        }
    }
    return max_len;
     }
 
};

class Solution 
{
public:
    int longestConsecutive(vector<int>& nums)
     {
 sort(nums.begin(), nums.end());
 int length = nums.size();
 int max = 1;
 if (length == 0 || length == 1) return length;
 int begin = 0;
 int l = 1;
         if (length == 0 || length == 1) return length;
         for (int begin = 0; begin < length - 1; begin++)
         {
           
             if (nums[begin] + 1 == nums[begin + 1])
             {
                 l++;
                 if (max < l) max = l;
             }
//之前一直是两个if 会导致else会被错误执行
             else if (nums[begin] == nums[begin + 1]) continue;
                 else
                 {
                     if (max < l) max = l;
                     l = 1;
                 }
             
         }
         return max;
     }
};

更改的重点是将双重循环改为了单循环

老版本是暴力求结果

新版本是将这一个和前一个进行对比,如果相等就再+1,如果刚刚好大于1就长度+1

相关推荐
毕竟是shy哥1 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲1 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
恋恋西风1 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx1 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_2 小时前
C++(22)——类型转换和IO流
开发语言·c++
晊晌_h2 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦3 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考3 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客4 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
青梅味猪大肠4 小时前
【深入浅出C++】为什么虚表指针可以解决菱形继承
开发语言·c++