最长上升连续子序列

描述

给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)

注意事项

time

样例

给定 [5, 4, 2, 1, 3], 其最长上升连续子序列(LICS)为 [5, 4, 2, 1], 返回 4.

给定 [5, 1, 2, 3, 4], 其最长上升连续子序列(LICS)为 [1, 2, 3, 4], 返回 4.

思考

  1. 计算连续递增的最长序列长度,如果长度大于 length/2, 则直接返回
  2. 计算连续递减的最长序列长度,如果长度大于 length/2, 则直接返回
  3. 否则,比较两个最长序列长度

代码

//  By Lentitude


class Solution {
public:
    /**
    * @param A an array of Integer
    * @return  an integer
    */
    int longestIncreasingContinuousSubsequence(vector<int>& A) {
        // Write your code here
        // longest
        if (A.empty()) return 0;

        int temp = 1;       // 记录连续长度
        int ret_r = 0;        // 记录向右连续的最长长度
        int i = 1;

        // 正序查看最长连续
        while (i < A.size()) {
            if (A[i] >= A[i - 1]) {
                ++temp;
            }
            else {
                // 注意: else 情况不是一定发生,所以必须有 2 的存在,来比较最后一次结果。后面同理
                ret_r = max(ret_r, temp);    // 1
                temp = 1;
            }
            ++i;
        }

        ret_r = max(ret_r, temp);  // 2
        // 如果递增连续序列长度大于length/2,则直接返回数据
        if (ret_r > A.size() / 2){
            return ret_r;
        }



        i = 1;
        temp = 1;
        int ret_l = 0;
        while (i < A.size()) {
            if (A[i - 1] >= A[i]) {
                ++temp;
            }
            else {
                ret_l = max(ret_l, temp);
                temp = 1;
            }
            ++i;
        }
        ret_l = max(ret_l, temp);

        // 如果递减连续序列长度大于length/2,则直接返回数据
        if (ret_l > A.size() / 2){
            return ret_l;
        }

        // 否则进行比较
        return max(ret_l, ret_r);


    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值