【算法手记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; }
结语
说点啥好呢...