一道头条笔试题:求区间的个数

给定两个长度都为N的整型数组a[N]和b[N],求满足如下条件的闭区间个数:在区间[l,r]上,a中的任意元素都比b中的任意元素小。

这个问题是O(N)复杂度。
关键在于发现一个规律:如果在区间[l+d,r]上满足上述条件,那么在更小的区间上[l,r]必然也满足上述条件,所以就可以用一个指针不停往后走。

import java.util.Scanner;

public class Main {

Main() {
    Scanner cin = new Scanner(System.in);
    int n = cin.nextInt();
    int[] a = new int[n];
    int[] b = new int[n];
    for (int i = 0; i < n; i++) a[i] = cin.nextInt();
    for (int i = 0; i < n; i++) b[i] = cin.nextInt();
    int s = 0;
    for (int i = 0; i < n; ) {
        if (a[i] >= b[i]) {
            i++;
            continue;
        }
        int ma = Integer.MIN_VALUE, mi = Integer.MAX_VALUE;
        int r = i;
        for (; r < n; r++) {
            ma = Math.max(a[r], ma);
            mi = Math.min(b[r], mi);
            if (mi <= ma) break;
        }
        s += (r - i + 1) * (r - i) / 2;
        if (i == r) i++;
        else i = r;
    }
    System.out.println(s);
}

public static void main(String[] args) {
    new Main();
}
}

猜你喜欢

转载自www.cnblogs.com/weiyinfu/p/9499427.html
今日推荐