码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-19 11:00:05      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:+=   print   bre   exti   main   break   oid   string   sys   

给定两个长度都为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();
}
}

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

标签:+=   print   bre   exti   main   break   oid   string   sys   

原文地址:https://www.cnblogs.com/weiyinfu/p/9499427.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!