题解 | #牛牛的数列#
牛牛的数列
https://ac.nowcoder.com/acm/problem/13134
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 处理输入
Scanner in = new Scanner(System.in);
int len = in.nextInt();
int[] nums = new int[len];
for(int i = 0; i < len; i++) {
nums[i] = in.nextInt();
}
// res用于记录返回的结果,idx记录上一次非严格递增的起始索引
int res = 0, idx = -1;
// i用于记录待考察的序列起始索引
// k用于记录待考察的序列结束索引
// j用于记录下一个数字,用于和k处数值进行比较,以判断是否为严格递增
int i = 0, k = i, j = k + 1;
while (j < len) {
if (nums[k] >= nums[j]) {
// 非严格递增,此时判断是否之前记录过一次非严格递增的起始索引,如果记录过则更新下res和i
// 因为最多只能变更一个数字,如果没记录过则记录一次
if (idx != -1) {
res = Math.max(res, j - i);
i = idx + 1;
}
idx = k;
} else if (idx - 1 >= i && idx == k - 1) {
// 如果上一次非严格递增后又紧接着一次严格递增,那么这时候需要排除掉数值“相等”的情况,
// 因为变更后的序列不能有连续重复的数字(不符合严格递增),所以需要排除掉没有“合适”
// 变更数值的情况,比如:“2 4 3 5”,2和5之间只有3和4两个数字,如果需要严格递增,则
// 只能是“2 3 4 5”,这样就必须变更两个数字,而对于“2 3 1 5”而言,只需要把1变更为4
// 即可
if (nums[k] - nums[idx - 1] < 1 && nums[j] - nums[idx] < 1) {
i = idx + 1;
idx = -1;
}
}
// 变更k、j,以考察下一个数值
k = j++;
}
// 最后再更新下res即可
res = Math.max(res, j - i);
System.out.println(res);
}
}