自己的算法是将区间按照start排序,依次看排序后的每个节点,在之后结点的start序列中二分查找当前结点end点的位置,位置差之和即可。
但是下面的算法更简单。
http://blog.csdn.net/caopengcs/article/details/9327069
// you can also use includes, for example:
// #include <algorithm>
#include <algorithm>
using namespace std;
int solution(const vector<int> &A) {
// write your code here...
int n = A.size(), m = n << 1, i, r, d;
vector<pair<long long, int> > a;
a.resize(m);
for (i = m = 0; i < n; ++i) {
a[m++] = make_pair(((long long) i) - A[i], -1);
a[m++] = make_pair(((long long) i) + A[i], 1);
}
sort(a.begin(), a.end());
for (i = r = d = 0; i < m; ++i) {
if (a[i].second < 0) {
if ((r += d++) > 10000000) {
return -1;
}
}
else {
--d;
}
}
return r;
}