目录
一、原题再现
二、问题分析
三、完整代码
一、原题再现
链接:排序子序列_牛客笔试题_牛客网
来源:牛客网[编程题]排序子序列
- 热度指数:10105 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
- 算法知识视频讲解
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为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
二、问题分析
本题目的意思是找子序列,并求出子序列的个数。可能一开始会有点读不懂题目,我们直接看样例,画一个示意图演示:
如果后一个比前一个大或者后一个比前一个小,子序列数量就加一;如果后一个等于前一个,子序列数量保持不变。
这里我选用了ArrayList列表,创建一个链表对象List<Integer> list = new ArrayList<>()。利用for循环和ArrayList中自带的add()方法,将元素添加进列表。使用双层循环,外层循环遍历整个列表(元素),内层循环使用if判断前一个元素和后一个元素的大小关系。
三、完整代码
import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); List<Integer> list = new ArrayList<>(); int n = sc.nextInt(); for (int i = 0; i < n; i++) { int A_i = sc.nextInt(); list.add(A_i); } int count = 0; if (list.size() <= 2) { count = 1; } for (int j = 0; j < list.size(); j++) { if ((j < list.size() - 1) && list.get(j) == list.get(j + 1)) { continue; } else if ((j < list.size() - 1) && list.get(j) < list.get(j + 1)) { while ((j < list.size() - 1) && list.get(j) <= list.get(j + 1)) { j++; } count++; } else { while ((j < list.size() - 1) && list.get(j) >= list.get(j + 1)) { j++; } count++; } } System.out.println(count); } }