玩游戏 跳格子1-N 每个格子高度不同;
连续3个递增格子则视为是有难度的;
如1,2,3,4 {1,2,3} {2,3,4}是两个连续3个递增数列 因而有2个难度;
然后输入查询 比如输入[1,3] 包含{1,2,3}递增数列 难度为1,输入[1,4]则难度为2;
输入:
- 格子数;
- 每个格子的高度
- 查询总数;
- 查询的起始范围;
输出:
- 每个起始范围内的难度数;
思路:哈希数组保存每个格子与之前的两个格子是否构成递增序列,每次查询[start,end]从start+2的位置开始遍历true的总数
import java.util.Scanner;
//360校招 -难度数 Evan XU -TJU
public class Test{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int arrL = input.nextInt();
int arr[] = new int[arrL];
boolean flag[] = new boolean[arrL]; //哈希表
for (int i = 0; i < arrL; i++) {
arr[i]=input.nextInt();
}
buildBoolean(arr,flag); //构建哈希表
int queryL = input.nextInt();
int res[] = new int[queryL];
for (int i = 0; i < queryL; i++) {
res[i]=findCount(flag,input.nextInt(),input.nextInt());
}
for (int i = 0; i < queryL; i++) {
System.out.println(res[i]);
}
}
public static void buildBoolean(int arr[],boolean flag[]){
for (int i=2;i<arr.length;i++){
if(arr[i]>arr[i-1]&&arr[i-1]>arr[i-2])
flag[i]=true;
else
flag[i]=false;
}
}
public static int findCount(boolean flag[],int i,int j){ //查询[i,j]范围内的难度
int flagL =flag.length;
if(j-i<2||i<1||i>flagL||j<1||j>flagL)
return 0;
int count =0 ;
for (int k = i+1; k <=j-1 ; k++) {
if (flag[k])
count++;
}
return count;
}
}
测试用例:
5
1 2 3 4 4
5
1 2
1 3
2 4
1 4
1 5
0
1
1
2
0