牛客对应题目链接:排序子序列_牛客笔试题_牛客网 (nowcoder.com)
一、分析题目
根据题意,用指针模拟即可。
二、代码
//知道学习的代码 #include <iostream> using namespace std; const int N = 1e5 + 10; int n; int arr[N]; int main() { cin >> n; for(int i = 0; i < n; i++) cin >> arr[i]; int ret = 0, i = 0; while(i < n) { if(i == n - 1) { ret++; break; } if(arr[i] < arr[i + 1]) { while(i + 1 < n && arr[i] <= arr[i + 1]) i++; ret++; } else if(arr[i] > arr[i + 1]) { while(i + 1 < n && arr[i] >= arr[i + 1]) i++; ret++; } else { while(i + 1 < n && arr[i] == arr[i + 1]) i++; } i++; } cout << ret << endl; return 0; }
三、反思与改进
这是一道纯模拟题,需要考虑多种情况。这里用一个指针进行前后比较即可,不需要用到双指针。可以将数组看作成一张折线图(直观),需要考虑最开始如果是平直的线要如何处理,以及最后如果一个点自成一组该如何处理,主要就是考虑好边界情况。