小明这些天一直在思考这样一个奇怪而有趣的问题:
在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:
如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。
当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。
输入格式
第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。
第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。
输出格式
输出一个整数,表示不同连号区间的数目。
样例输入1
4
3 2 4 1
样例输出1
7
样例输入2
5
3 4 2 5 1
样例输出2
9
/** * @version 1.0 * @auther 孙沐华 * 连号区间数 */ public class test10 { public static void main(String[] args) { //如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素) // 递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。 Scanner scanner = new Scanner(System.in); int sum=0; int N= Integer.parseInt(scanner.nextLine()); ArrayList<Integer> list = new ArrayList<>(); list.add(0); String line =scanner.nextLine(); String[] split = line.split(" ");//该方法 分割 也就是见到一个空格就分开 空格表示分隔符 for (int j = 0; j <split.length ; j++) { list.add(Integer.parseInt(split[j])); //这里只把数字留下 } for (int i = 1; i <=N ; i++) { int max=0; int min=0; for (int j = i; j <=N ; j++) { if (i==j){ sum++; }else { max = Math.max(max, list.get(j)); min = Math.min(min, list.get(j)); if (max - min == j - i + 1) { sum++; } } } } System.out.println(sum); } }
标签:小明,java,String,int,样例,区间,scanner From: https://www.cnblogs.com/xingxingbclg/p/17035797.html