[LintCode] Longest Increasing Continuous Subsequence

Give an integer array,find the longest increasing continuous subsequence in this array.

An increasing continuous subsequence:

  • Can be from right to left or from left to right.
  • Indices of the integers in the subsequence should be continuous.

Example

For [5, 4, 2, 1, 3], the LICS is [5, 4, 2, 1], return 4.

For [5, 1, 2, 3, 4], the LICS is [1, 2, 3, 4], return 4.

Challenge: O(n) time and O(1) extra space

Solution.

Scan input array twice. The first time to find the length of LICS from left to right. The second time to find the length of LICS from right to left.

During scanning, if the next element is strictly bigger than the previous element, increment len by 1, else init len to 1. After checking each element,

update the current max length.

 1 public class Solution {
 2     public int longestIncreasingContinuousSubsequence(int[] A) {
 3         if(A == null || A.length == 0){
 4             return 0;
 5         }
 6         if(A.length == 1){
 7             return 1;
 8         }
 9         int max = 0;
10         int len = 1;
11         for(int i = 1; i < A.length; i++){
12             if(A[i] > A[i - 1]){
13                 len++;
14             }
15             else{
16                 len = 1;
17             }
18             max = Math.max(max, len);
19         }
20         len = 1;
21         for(int i = A.length - 2; i >= 0; i--){
22             if(A[i] > A[i + 1]){
23                 len++;
24             }
25             else{
26                 len = 1;
27             }
28             max = Math.max(max, len);
29         }
30         return max;
31     }
32 }

Follow up question: Reconstruct an optimal solution from dynamic programming

The above solution uses O(1) memory. What about if you need to return the start and end indices of a LICS(pick any if there is multiple answer)?

Q: In this case, we need O(n) memory to store the lenght of an ICS that ends at each element.

leftToRight[i]: from left to right, the length of the ICS that ends at A[i].

rightToLeft[i]: from right to left, the length of the ICS that starts at A[i].

 1 public class Solution {
 2     public ArrayList<Integer> longestIncreasingContinuousSubsequence(int[] A) {
 3         if(A == null || A.length == 0){
 4             return 0;
 5         }
 6         if(A.length == 1){
 7             return 1;
 8         }
 9         int n = A.length;
10         int[] leftToRight = new int[n]; int[] rightToLeft = new int[n];
11         leftToRight[0] = 1; rightToLeft[n - 1] = 1;
12         for(int i = 1; i < A.length; i++){
13             if(A[i] > A[i - 1]){
14                 leftToRight[i] = leftToRight[i - 1] + 1;
15             }
16             else{
17                 leftToRight[i] = 1;
18             }
19         }
20         for(int i = A.length - 2; i >= 0; i--){
21             if(A[i] > A[i + 1]){
22                 rightToLeft[i] = rightToLeft[i + 1] + 1;
23             }
24             else{
25                 rightToLeft[i] = 1;
26             }
27         }
28         int leftToRightEndIdx = 0; int rightToLeftStartIdx = n - 1;
29         int leftToRightMax = 0; int rightToLeftMax = 0;
30         for(int i = 0; i < n; i++){
31             if(leftToRight[i] > leftToRightMax){
32                 leftToRightMax = leftToRight[i];
33                 leftToRightEndIdx = i;
34             }
35         }
36         for(int i = n - 1; i >= 0; i--){
37             if(rightToLeft[i] > rightToLeftMax){
38                 rightToLeftMax = rightToLeft[i];
39                 rightToLeftStartIdx = i;
40             }
41         }
42         ArrayList<Integer> indices = new ArrayList<Integer>();
43         if(leftToRightMax >= rightToLeftMax){
44             indices.add(leftToRightEndIdx - leftToRightMax + 1);
45             indices.add(leftToRightEndIdx);
46         }
47         indices.add(rightToLeftStartIdx);
48         indices.add(rightToLeftStartIdx + rightToLeftMax - 1);
49         return indices;
50     }
51 }

Related Problems

Longest Increasing Continuous subsequence II

时间: 2024-08-10 13:45:45

[LintCode] Longest Increasing Continuous Subsequence的相关文章

[LintCode] Longest Increasing Continuous Subsequence 最长连续递增子序列

Give an integer array,find the longest increasing continuous subsequence in this array. An increasing continuous subsequence: Can be from right to left or from left to right. Indices of the integers in the subsequence should be continuous. Notice O(n

LintCode &quot;Longest Increasing Continuous subsequence II&quot; !!

DFS + Memorized Search (DP) class Solution { int dfs(int i, int j, int row, int col, vector<vector<int>>& A, vector<vector<int>>& dp) { if(dp[i][j] != 0) return dp[i][j]; if (i > 0 && A[i-1][j] > A[i][j]) { dp

Longest Increasing Continuous subsequence II

Give you an integer matrix (with row size n, column size m),find the longest increasing continuous subsequence in this matrix. (The definition of the longest increasing continuous subsequence here can start at any row or column and go up/down/right/l

Longest Increasing Continuous Subsequence

Give an integer array,find the longest increasing continuous subsequence in this array. An increasing continuous subsequence: Can be from right to left or from left to right. Indices of the integers in the subsequence should be continuous. Notice O(n

lintcode 容易题:Longest Increasing Continuous subsequence 最长上升连续子序列

题目: 最长上升连续子序列 给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列.(最长上升连续子序列可以定义为从右到左或从左到右的序列.) 样例 给定 [5, 4, 2, 1, 3], 其最长上升连续子序列(LICS)为 [5, 4, 2, 1], 返回 4. 给定 [5, 1, 2, 3, 4], 其最长上升连续子序列(LICS)为 [1, 2, 3, 4], 返回 4. 解题: 这个直接找就可以了,最长的升序,和最长的降序,再求最大值,时

lintcode-easy-Longest Increasing Continuous Subsequence

Give an integer array,find the longest increasing continuous subsequence in this array. An increasing continuous subsequence: Can be from right to left or from left to right. Indices of the integers in the subsequence should be continuous. Example Fo

Longest Increasing Common Subsequence (LICS)

最长上升公共子序列(Longest Increasing Common Subsequence,LICS)也是经典DP问题,是LCS与LIS的混合. Problem 求数列 a[1..n], b[1..m]的LICS的长度, a[], b[]数组的元素均为正整数. Solution 考虑如何定义DP状态,定义DP状态就是定义所谓的最优子问题(optimal subproblem),而DP状态要能转移,就是所谓最优子问题要具有重叠子结构. 将DP状态定义为 DP[i][j]:a[1..i], b[

LintCode Longest Increasing Subsequence

Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return the length of the LIS. Clarification What's the definition of longest increasing subsequence? The longest increasing subsequence problem is to find a

[Coding Made Simple] Longest Increasing Subsequence

Given an array, find the longest increasing subsequence in this array. The same problem link. [LintCode] Longest Increasing Subsequence