admin管理员组

文章数量:1442895

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

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

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

题目详情:

本题详情如下图:


题目思路:

本题解题思路如下: 解法一: 去重+排序后双指针统计递增序列元素个数,记录最长序列长度.时间复杂度主要是排序的复杂度O(nlogn). 解法二: 哈希遍历。用哈希表记录数据范围内这个数字是否出现过,而后遍历哈希表查看连续位置是否存在数字,统计递增序列元素个数,记录最长序列长度.但是注意本题数据范围是10^8,开这么大的整型数组会内存超限,我们可以开一个位图或者char类型的数组来标记数据是否存在,本文解题代码用的是位图。


解题代码:

本题解题代码如下:

解法1:

代码语言:javascript代码运行次数:0运行复制
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:

代码语言:javascript代码运行次数:0运行复制
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]);


解题代码:

本题解题代码如下:

代码语言:javascript代码运行次数:0运行复制
#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;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-03-30,如有侵权请联系 cloudcommunity@tencent 删除算法int排序数据数组

本文标签: 算法手记8NC95 数组中的最长连续子序列 ampamp 字母收集