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下标的值
注意!!!
但是现在有一个情况,当比较到最后的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);
}
}
}
真好,又活过一天啊,加油,每天坚持,我们是最棒的
完结散花