题解 | #牛牛的数列#

牛牛的数列

https://ac.nowcoder.com/acm/problem/13134

打开题解看了看,基本都是在dp,其实这道题给我的第一直觉就是双指针解法.

也就是说,数组可以拆分成一定数量的子数组,这些子数组的长度至少为1且子数组内的元素都是绝对升序排列的,那么题意就转化成求满足条件的相邻子数组的最大长度和,这个条件就:是否能通过改变相邻子数组交界处的一个数,从而将它们连接成一个绝对升序排列的序列. 这里需要注意的有两点.

1.数组已经绝对升序排列,那么返回数组的长度即可.

2.相邻子数组满足连接条件时,此时序列的长度为相邻子数组的长度和;相邻子数组不满足连接条件时,此时也存在一个绝对升序排列的序列,它的长度是较长子数组的长度+1.

那么很明显双指针(或者说是快慢指针)很适合这道题,只需要遍历一遍数组即可.代码如下:

import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n =Integer.parseInt(br.readLine().split(" ")[0]);
        int[] nums = new int[n];
        String[] strNums = br.readLine().split(" ");
        for(int i = 0; i < strNums.length; ++i){
            nums[i] = Integer.parseInt(strNums[i]);
        }
        System.out.println(nums.length < 3 ? nums.length : new Main().deal(nums));
        
    }
    private int deal(int[] nums){
        int begin = 0, end = 0, preLength = 0, maxLength = 0;
        while(end < nums.length){
            if((end < nums.length - 1 && nums[end + 1] <= nums[end]) || (end == nums.length - 1)){
                if(judge(nums, begin, end, preLength)){
                    maxLength = Math.max(end - begin + 1 + preLength, maxLength);
                }else{
                    maxLength = Math.max(Math.max(preLength, end - begin + 1) + 1, maxLength);
                }
                preLength = end - begin + 1;
                begin = end + 1; 
            }
            ++ end;
        }
        return maxLength;
    }
    private boolean judge(int[] nums, int begin, int end, int preLength){
        if(begin == 0 || preLength == 1 || begin == end)
            return true;
        if(nums[begin] - nums[begin - 2] > 1 || nums[begin + 1] - nums[begin - 1] > 1)
            return true;
        return false;
    }
}
全部评论

相关推荐

神哥了不得:放平心态,再找找看吧,主要现在计算机也变卷了,然后就比较看学历了,之前高中毕业你技术强,都能找到工作的
点赞 评论 收藏
分享
02-02 20:25
门头沟学院 Java
数学转码崽:八股文也算是前人总结的精华,但是因为全是结果导向,你光背不去理解它背后的深层原理和这样做的原因,反而忽略了程序员最该重视的过程导向。推荐你不会的就去多问ai,比如我当时背的时候,concurrenthashmap底层原理常见八股网站都会讲,但是我不理解为什么它去用synchronize锁节点,为什么不用reentrantlock去锁节点。面试官问我你为什么觉得synchronize在这个场景下性能更好呢?虽然面试官可能也不确定清楚,但是你可以尝试给他解答,让他看见你的思考,这才是最重要的,毕竟你没实习,你的项目你也无法证明是你自己思考的产物,那就在别的地方体现你的能力
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务