目录
1、最长连续递增序列
问题描述
给定一个未经排序的整数数组,找到最长且连续的的递增序列。
示例 1:
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。
示例 2:
输入: [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1。
注意:数组长度不会超过10000。
public static int maxLength(int[] nums){
if(null == nums || nums.length == 0){
return 0;
}
int max = 0;
int count = 0;
for(int i = 1; i < nums.length; i++){
count = nums[i] > nums[i - 1] ? count + 1 : 0;
if(count > max){
max = count;
}
}
//加上第一个节点自身
return max +1;
}
2、最长递增序列
问题描述
给定一个未经排序的整数数组,找到最长的的递增序列。
示例 1:
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5,7]/[1,3,4,7], 长度为4。
采用动态规划,思想类似:【字符串】【动态规划】最长公共子序列问题
public static int maxLength1(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int[][] tmp = new int[nums.length + 1][nums.length + 1];
for (int i = 1; i <= nums.length; i++) {
for (int j = i + 1; j <= nums.length; j++) {
if (nums[j - 1] > nums[i - 1]) {
tmp[i][j] = Math.max(1 + tmp[i - 1][j - 1], tmp[i - 1][j]);
} else {
tmp[i][j] = Math.max(tmp[i - 1][j - 1], tmp[i - 1][j]);
}
}
}
//加上第一个节点自身
return tmp[nums.length - 1][nums.length] + 1;
}
public static int maxLength1(int[] array){
if(null == array || array.length == 0){
return 0;
}
int max = 1;
int[] tmp = new int[array.length];
for(int i = 0; i < array.length; i++){
tmp[i] = 1;
for(int j = 0; j < array.length; j++){
if(array[i] > array[j] && tmp[j] >= tmp[i]){
tmp[i] = tmp[j] + 1;
}
}
Math.max(max, tmp[i]);
}
return max;
}