给定一个未经排序的整数数组,找到最长且连续的的递增序列。
示例 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 findLengthOfLCIS(int[] nums) {
if (nums.length==0) return 0;
int max=1,re=1;
for (int i = 1; i <nums.length ; i++) {
if (nums[i]>nums[i-1]) {
max++;
re=max>re?max:re;
}
else max=1;
}
return re;
}
/**********动态规划版本*********/
public int findLengthOfLCIS(int[] nums) {
if (nums.length==0) return 0;
int[][] dp=new int[nums.length][nums.length];
int maxL=1; //记录长度
for (int i = 0; i < nums.length - 1; i++) { //初始化
dp[i][i]=1;
if (nums[i]<nums[i+1]) {
dp[i][i+1]=1;
maxL=2;
}
else dp[i][i+1]=0;
}
dp[nums.length-1][nums.length-1] =1;
for (int l=3;l<=nums.length;l++){ //长度
for (int i = 0; i <= nums.length-l; i++) {
if (dp[i+1][i+l-2]==1 &&nums[i]<nums[i+1] && nums[i+l-1]>nums[i+l-2]) { //符合条件
dp[i][i+l-1]=1;
maxL=l;
}
else dp[i][i+l-1]=0;
}
}
return maxL;
}