给定一个整数数组(下标从 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
.
/*
思路:
正序逆序各求一个最长序列的值,取最大
一个全局变量res记录最长的长度,一个局部变量temp
当nums[i] > nums[i - 1]时,temp加1
当nums[i] <= nums[i - 1]时,temp重置为1*/
//aC
public class Solution {
public int longestIncreasingContinuousSubsequence(int[] A) {
if (A == null || A.length == 0) {
return 0;
}
int n = A.length;
int answer = 1;
// 从左到右
int length = 1; // just A[0] itself
for (int i = 1; i < n; i++) {
if (A[i] > A[i - 1]) {
length++;
} else {
length = 1;
}
answer = Math.max(answer, length);
}
// 从右到左
length = 1;
for (int i = n - 2; i >= 0; i--) {
if (A[i] > A[i + 1]) {
length++;
} else {
length = 1;
}
answer = Math.max(answer, length);
}
return answer;
}
}
/*
动态规划分析:
1.从左到右:设数组a为该数组,dp[i]存储前 i 个的数总和
则 if(a[i]>a[i-1]) dp[i]=dp[i-1]+value,i从1开始
3.从右到左:同样,不过判断为a[i]<a[i+1] dp[i]=dp[i+1]+value,i从n-2开始
*/
//没有ac
/*public class Solution {
public int longestIncreasingContinuousSubsequence(int[] nums) {
if(nums.length ==0 || nums == null) return 0;
int len = nums.length;
// 记录到当前位置最长升序序列的长度
int dp[] = new int[len];
dp[0] = 1;
//从左到右
for(int i =1;i<len;i++){
//
if(nums[i]>nums[i-1]){
dp[i] =Math.max(dp[i],dp[i-1]+nums[i]);
}
}
//从右到左
for(int i =len-2;i>=0;i--){
//
if(nums[i]<nums[i+1]){
dp[i] = Math.max(dp[i],dp[i+1]+nums[i]);
}
}
return dp[len-1];
}
}
*/