一、 题目
题目链接:牛客:排列子序列
二、解题思路
我们得先知道非递减或非递增与递减递增的区别:
- 定义一个ans用于计算非递增与非递增序列出现的次数,定义一个start指针遍历数组,进行判断。
- 如果arr[start] > arr[arr+1],则让start++,直到这个循环走完,再ans++;
- 同理,如果arr[start] < arr[arr+1],则让start++,直到这个循环走完,再ans++;
- 如果arr[start] == arr[arr+1],则直接start++ 就可以了。
这里有一个点需要注意的是,我们的数组定义要比输入的n大1,不然的话会发生数据越界的情况。
三、代码实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int []arr = new int[n+1];
for(int i = 0;i < n; i++){
arr[i] = sc.nextInt();
}
int start = 0;
int ans = 0;
while(start < n){
if(arr[start]>arr[start+1]){
while(start < n && arr[start]>arr[start+1]){
start++;
}
ans++;
start++;
}else if(arr[start] == arr[start+1]){
start++;
}else{
while(start < n && arr[start]<arr[start+1]){
start++;
}
ans++;
start++;
}
}
System.out.println(ans);
}
}
四、反思
这个题其实还是算挺简单的,但是做的时候,心慌就搞不出来了,重写的时候,一点一点将自己的思路写下来,其实就不难了。 这里让我思考比较久的一个点是循环内套循环,也就是遍历数组的时候,如果让指针start++,而计数器ans不++,原来就是套一个循环而已,当了解了这个思路,再次回看,其实是自己蠢了…