最长上升连续子序列

来源:互联网 发布:网络新媒体就业前景 编辑:程序博客网 时间:2024/06/07 07:24

描述

给定一个整数数组(下标从 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 Lentitudeclass 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
原创粉丝点击