题解 | #牛牛的数列#

牛牛的数列

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);
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务