day7.31——连号区间数

题目:连号区间数

问题描述:
小明这些天一直在思考这样一个奇怪而有趣的问题:
在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

思路:

我们先来分析一下什么是“连号区间”(引用了其他博主的解释):

比如一组数:2 4 3 5 1
当看第一个数{ 2 } 的时候,这个区间只有一个数 [2],显然满足连续递增的条件,因此是“连号区间”;
当看前两个数{ 2 4 }的时候,我们把这个区间中的所有数递增排序得到 [2,4],发现其并不满足连续递增的条件(2与4之间缺少了数字3),因此不是“连号区间”;
当看前三个数{ 2 4 3 }的时候,我们把这个区间中的所有数递增排序得到 [2,3,4],发现其满足连续递增的条件,因此是“连号区间”;
当看前四个数{ 2 4 3 5 }的时候,我们把这个区间中的所有数递增排序得到 [2,3,4,5],发现其满足连续递增的条件,因此是“连号区间”;
当看所有数{ 2 4 3 5 1 }的时候,我们把这个区间中的所有数递增排序得到 [1,2,3,4,5],发现其满足连续递增的条件,因此是“连号区间”;
以上就是关于“连号区间”的定义了

接下来我们来看一下“连号区间”所满足的特点。可以很容易地看出,对于一个连号区间而言,其中最大的那个数减去最小的那个数其实刚好就等于这中间的所有数字的总量再减去1。即:
max - min = size_of_section - 1(size_of_section表示某个区间内的数字的总数) ①
如果我们把输入的N个数字的全排列放进一个数组arr中,如:arr[]={2,4,3,5,1}
那么我们表示某个区间内的数字数量的方法就是(假设有两个指针i,j分别指向区间的两端):
size_of_section = j - i + 1 ②
验证:例如对于arr[1]=4 , arr[3]=5,即标记了区间 2 4 3 5 1(红色部分),显然这个区间内有三个数4,3,5,则size_of_section = j - i + 1 = 3 - 1 + 1 = 3
此时我们再把②代入①中就可以得到:
max - min = j - i
这个公式是本题中最关键的一步。

这道题的整体思路:
  1. 首先输入一个整数N,再输入一个表示这N个数字的某一全排列;
  2. 用一个两重的for循环来进行题目关键部分,通过Math.max与Math.min两个函数得到最大与最小值;再用max - min = j - i公式判断是否符合连号区间数的定义,是就+1;
  3. 最后输出计数的结果。

代码:

public class LianHaoQuJianShu {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();//输入一个整数,表示数组中元素的个数
        int[] number = new int[n];//存储输入的整数数组
        for (int i = 0; i < n; i++) {
            number[i] = in.nextInt();
        }
        int times = 0;
        for (int i = 0; i < n; i++) {
            int max = number[i];
            int min = number[i];
            for (int j = i; j < n; j++) {
                max = Math.max(max, number[j]);//返回两个值中的大值
                min = Math.min(min, number[j]);//返回两个小值的小值
                if (max - min == j - i)//判断是否为连好区间数
                    times++;
            }
        }
        System.out.println(times);
    }
}
posted @ 2021-07-31 23:34  头秃准备  阅读(135)  评论(0)    收藏  举报