当前位置: 首页 > news >正文

【算法手记8】NC95 数组中的最长连续子序列 字母收集

🦄个人主页:修修修也

🎏所属专栏:刷题

⚙️操作环境:牛客网


目录

一.NC95 数组中的最长连续子序列

题目详情:

题目思路:

解题代码:

二.字母收集

题目详情:

题目思路:

解题代码:

结语


一.NC95 数组中的最长连续子序列

牛客网题目链接(点击即可跳转):NC95 数组中的最长连续子序列

题目详情:

本题详情如下图:


题目思路:

本题解题思路如下:

        解法一:

                去重+排序后双指针统计递增序列元素个数,记录最长序列长度.时间复杂度主要是排序的复杂度O(nlogn).

        解法二:

                哈希遍历。用哈希表记录数据范围内这个数字是否出现过,而后遍历哈希表查看连续位置是否存在数字,统计递增序列元素个数,记录最长序列长度.但是注意本题数据范围是10^8,开这么大的整型数组会内存超限,我们可以开一个位图或者char类型的数组来标记数据是否存在,本文解题代码用的是位图。


解题代码:

本题解题代码如下:

解法1:

class Solution 
{
public:
    
    int MLS(vector<int>& arr) 
    {
        //排序
        sort(arr.begin(),arr.end());
        int lpos=0,rpos=0,max_len=0;
        for(int i=0;i<arr.size();i++)
        {
            //判断当前数字是否和前一个构成递增
            if (i != 0 && arr[i]-arr[i-1] == 1) //构成递增
            {
                rpos++;
                if (rpos - lpos > max_len) 
                {
                    max_len = rpos - lpos;
                }
            }
            else if(i == 0 || arr[i]-arr[i-1] > 1)//不构成递增
            {
                lpos = i;
                rpos = i;
            }
            //这里还少一个arr[i]-arr[i-1] == 0的情况,但这种情况下我们做法是直接跳过,所以可以省略
        }
        return max_len+1;
    }
};

解法2:

class Solution 
{
  public:
    int MLS(vector<int>& arr) 
    {
    //排序,然后算
    //sort(arr.begin(),arr.end());
    //排序好像不行,换哈希吧
    //哈希空间有点问题
    //那就位图
        bitset<100000001> tmp;
        for (int e : arr) {
            tmp.set(e);
        }
        int lpos = 0, rpos = 0, max_leght = 0;
        for (int i = 0; i <tmp.size(); i++) 
        {
            //判断是不是第一个有序的
            if (i == 0 || tmp.test(i) == 0) 
            {
                lpos = i;
                rpos = i;
            }
            else 
            {
                rpos++;
                if (rpos - lpos > max_leght) 
                {
                    max_leght = rpos - lpos;
                }
            }
        }
        return max_leght;
    }
};

二.字母收集

牛客网题目链接(点击即可跳转):字母收集

题目详情:

本题详情如下图:


题目思路:

本题解题思路如下:

        dp填一个二维数组即可,dp方程是:d[i][j]=自己的分+max(d[i-1][j],d[i][j-1]);


解题代码:

本题解题代码如下:

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
    //贪心
    int n, m;
    cin >> n >> m;
    int vvc[501][501]={0};
    char ch;
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++) 
        {
            cin >> ch;
            if (ch == 'l') vvc[i][j] = 4;
            else if (ch == 'o') vvc[i][j] = 3;
            else if (ch == 'v') vvc[i][j] = 2;
            else if (ch == 'e') vvc[i][j] = 1;
            else vvc[i][j] = 0;
        }
    }
    //填表:d[i][j]=自己的分+max(d[i-1][j],d[i][j-1]);
    int vvdp[501][501]={0};
    int maxs=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(i==0 && j==0)
                vvdp[i][j]=vvc[i][j];
            else if(i==0)
                vvdp[i][j]=vvc[i][j]+vvdp[i][j-1];
            else if(j==0)
                vvdp[i][j]=vvc[i][j]+vvdp[i-1][j];
            else
                vvdp[i][j] = vvc[i][j] + max( vvdp[i-1][j],vvdp[i][j-1]);
            if(vvdp[i][j]>maxs)
            {
                maxs=vvdp[i][j];
            }
        }
    }
    cout<<maxs;
    return 0;
}

结语

        说点啥好呢...

相关文章:

  • AI 只能聊天、生成图片、生成视频吗?
  • 封装了一个iOS多分区自适应宽度layout
  • SQL生成ER图/AI生成ER图,智能生成ER图/在线快速编写ER图
  • 全局安装 Entity Framework Core (EF Core)
  • Redis持久化
  • 当 Windows 10 的 C 盘快满时,可以通过以下方法来释放空间
  • Redis-04.Redis常用命令-字符串常用命令
  • 什么是虚拟机?它们如何工作?
  • Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
  • 知能行综测
  • 算法基础
  • 人工智能:从科幻想象到社会重构的技术革命
  • JAVA反序列化深入学习(十):CommonsBeanutils1
  • 电器维修|基于Java+vue的电器维修系统(源码+数据库+文档)
  • 【踩坑】Mac mini m4 安装 jdk8 失败
  • Pytorch学习笔记(十八)Image and Video - DCGAN Tutorial
  • 机器学习ML极简指南
  • 【论文阅读】Co2l: Contrastive continual learning
  • 网络基本概念认识(2)
  • Java 多线程编程之 Object.wait 方法(工作原理、高级特性、notify 方法与 notifyAll 方法)
  • 网站建设推广是什么/游戏推广论坛
  • 湖南网站建设/指数函数图像及性质
  • 多语种网站营销/seo网站推广杭州
  • 网上做网站广告投放/郑州做网站推广资讯
  • 微信网站需要备案吗/by网站域名
  • 政府网站建设总体要求/上海网站seo策划