算法强化每日一题--排序子序列

算法强化每日一题--排序子序列_第1张图片

hello啊,今天继续为大家带来算法强化相关的题目,是一道关于排序子序列的题目,让我们一起来消灭它吧!

链接:排序子序列_牛客笔试题_牛客网
来源:牛客网
 

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2

 

输入描述:

输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)

第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。
 

输出描述:

输出一个整数表示牛牛可以将A最少划分为多少段排序子序列

示例1

输入

6
1 2 3 2 2 1

输出

2

首先我们认识一下非递增和非递减序列

非递增:一组数据总体来说是升序排序,但是中间有相等的数字,比如: 1 2 3 4 4 5 6

非递减:一组数据总体来说是降序排序,但是中间有相等的数字比如: 7 6 5 4 3 3 2 1 

现在来分析题目中的例子

1 2 3 2 2 1

1 2 3是一组,2 2 1是一组

定义一个计数器count

思路:

分为三种情况

1.当i下标的值

2.当i下标的值=i+1下标的值,i++即可

3.当i下标的值

注意!!!

算法强化每日一题--排序子序列_第2张图片

 

但是现在有一个情况,当比较到最后的1,i+1就越界了,没有值和它再比较了,我们可以采用多浪费一个空间的做法,在创建数组的时候长度变成n+1,这样就算最后的1和后面的数字比较,那就是和未初始化的数值比较,(未初始化,默认为0,),这也就是最后一组数据了,因为题目要求数组必须放大于等于1的正整数

看看代码

public class Main {
    public static void main(String[] args) {
        //先处理输入
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] array = new int[n + 1];
        for (int i = 0; i < n; i++) {
            array[i] = scanner.nextInt();
        }
        //定义下标
        int i = 0;
        int count = 0;
        //分三种情况
        while (i < n) {
            if (array[i] < array[i + 1]) {
                while (i < n && array[i] < array[i + 1]) {
                    i++;
                }
                count++;
                i++;
            } else if (i < n && array[i] == array[i + 1]) {
                i++;
            } else {
                while (i < n && array[i] > array[i + 1]) {
                    i++;
                }
                count++;
                i++;
            }
            System.out.println(count);
        }
    }
}

真好,又活过一天啊,加油,每天坚持,我们是最棒的

完结散花

                               算法强化每日一题--排序子序列_第3张图片

你可能感兴趣的:(算法强化,html,前端)