最长连续序列

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

相关推荐
小雨下雨的雨4 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*7 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
cfm_29148 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
如竟没有火炬8 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
8Qi89 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术9 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构
Qt程序员10 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
想吃火锅100510 小时前
【leetcode】1.两数之和js版
javascript·算法·leetcode