最长连续序列

复制代码
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

相关推荐
AI小老六9 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术10 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize11 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl