Code & Func
2019-12-04

第28天。

今天的题目是Best Sightseeing Pair:

这道题的关键就是什么时候移动 i 这个下标,我们观察一下这个公式:A[i] + A[j] + i - j,转化一下就成了(A[i] + i) + (A[j] - j),因此如果存在两个i,即i1i2的话,当A[i1] + i1 > A[i2] + i2成立时,我们就可以用 i2去替代原来的i1。至于j的话,我们只需要从头到尾遍历一遍即可,同时在穷举j的时候,可以顺便穷举出i

1
int maxScoreSightseeingPair(vector<int>& A) {
2
int size = A.size();
3
int res = 0;
4
if (size == 0) return res;
5
6
for(int i = 0, j = 1;j < size; j++) {
7
res = max(res, A[i] + A[j] + i - j);
8
if (A[j] + j > A[i] + i) i = j;
9
}
10
11
return res;
12
}

我们把式子重写成A[j] + (A[i] + i - j),随着j++i - j会减一,如果不改变 i的话,(A[i] + i - j)相比于之前就只是减一而已,如果要改变的话,A[i] + i - j = A[j] - 1,则我们可以将循环简化成:

1
int maxScoreSightseeingPair(vector<int>& A) {
2
int size = A.size();
3
int res = 0;
4
if (size == 0) return res;
5
int cur = 0;
6
for(int j = 0;j < size; j++) {
7
res = max(res, cur + A[j]);
8
cur = max(cur, A[j]) - 1;
9
}
10
11
return res;
12
}
上一条动态