【每日一练】Longest Continuous Increasing Subsequence

74 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情

在这里插入图片描述

简介

Hello!

非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~  

ଘ(੭ˊᵕˋ)੭

昵称:海轰

标签:程序猿|C++选手|学生

简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研

学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!

唯有努力💪

【每日一读】每天浅读一篇论文,了解专业前沿知识,培养阅读习惯(阅读记录 仅供参考)

运行结果

在这里插入图片描述

题目描述

Given an unsorted array of integers, find the length of longest continuous increasing subsequence (subarray).(Test cases are for reference only, you will be scored by the quality of code.)

给定一个未排序的整数数组,求其最长的连续递增子序列(子数组)的长度。(测试用例仅供参考,您将根据代码的质量打分。)

输入描述:

Enter the integer n in the first line. Enter n integers in the second line.

在第一行输入整数n。在第二行中输入n个整数。

输出描述:

Outputs the length of the longest incremental sequence.

输出最长增量序列的长度。

示例

在这里插入图片描述

代码

题目的意思就是寻找数组中最长递增连续序列的长度

思路比较简单:直接一次遍历 使用变量cnt记录递增序列的长度即可(遇到不递增 重置cnt=1即可)

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

int solution(int n, std::vector<int>& vec){
    int result = -1;
    int cnt = 1;
    for(int i = 1; i < n; ++i) {
        if(vec[i] > vec[i-1]) {
            ++cnt;
        } else {
            result = max(result, cnt);
            cnt = 1;
        }
    }
    result = max(result, cnt);
    // TODO: 
    return result;
}

int main() {

    int n;
    std::vector<int> vec;

    std::cin>>n;
    
    std::string line_0, token_0;
    getline(std::cin >> std::ws,line_0);
    std::stringstream tokens_0(line_0);
    while(std::getline(tokens_0, token_0, ' ')){
        vec.push_back(std::stoi(token_0));
    }
    

    int result = solution(n,vec);

    std::cout<<result<<std::endl;

    return 0;
}

一运行,发现全错....

在这里插入图片描述

结合之前的教训,只有一种可能了:题目错了 或者 测试用例给成另一道题的了

后面一测试,果然,这道题题目没有错,给成另一题目的测试用例了.....

原题目是:

在这里插入图片描述

也就是求:最长递增子序列

与之前题目的变化就是,不需要要求是连续的了...

哎,离谱 ,测试用例都给成其他题目的了....

这里的思路就变成了:

  • 总体思路与之前一样
  • 只不过需要先求以每一个元素为序列最后一个元素时,递增数的多少
  • 最后找出全局的最大值即可

比如【1,3,2,4,7】

  • 先求以1为序列结尾的最大递增序列长度
  • 再求以3为序列结尾的最大递增序列长度 ....
  • 再求以7为序列结尾的最大递增序列长度

最后return 每一次结果中的最大值即可

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

int solution(int n, std::vector<int>& nums){
    	vector<int> dp(nums.size(), 1);        
        int maxLen = 0;
        for(int i=0; i<nums.size(); i++)
        {
            int temp = 1;
            for(int j=0; j<i; j++)
            {
                if(nums[i] > nums[j])
                {
                    temp = max(temp, dp[j]+1);
                }
            }
            
            dp[i] = temp;
            maxLen = max(maxLen, dp[i]);
        }
        
        return maxLen;
}

int main() {

    int n;
    std::vector<int> vec;

    std::cin>>n;
    
    std::string line_0, token_0;
    getline(std::cin >> std::ws,line_0);
    std::stringstream tokens_0(line_0);
    while(std::getline(tokens_0, token_0, ' ')){
        vec.push_back(std::stoi(token_0));
    }
    

    int result = solution(n,vec);

    std::cout<<result<<std::endl;

    return 0;
}

测试通过 ✅

在这里插入图片描述

在这里插入图片描述