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;
本文标签: 算法手记8NC95 数组中的最长连续子序列 ampamp 字母收集
版权声明:本文标题:【算法手记8】NC95 数组中的最长连续子序列 && 字母收集 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1748065796a2801405.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论