1014. Best Sightseeing Pair

问题:

给定一个山峦分布数组,元素值代表高度。

假设score分值=两山高度和-两山距离=A[i]+A[j]-(j-i)=A[i]+A[j]+i-j

求这个分值最高是多少?

Example 1:
Input: [8,1,5,2,6]
Output: 11
Explanation: i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11
 

Note:
2 <= A.length <= 50000
1 <= A[i] <= 1000

  

解法1:

按照题意,求找尽可能高的两座山,且其距离越短越好。

转而理解为:

假设已找到目前为止最高的山高度cur,再找另一座山的时候,随着距离增大,cur会不断减分,

最终得分res=cur减完分后+新找到的山高

 

代码参考:

 1 class Solution {
 2 public:
 3     int maxScoreSightseeingPair(vector<int>& A) {
 4         int res=0, cur=0;
 5         for(int a:A){
 6             res=max(res, cur+a);
 7             cur=max(cur, a)-1;
 8         }
 9         return res;
10     }
11 };

 

解法2:

要求max(A[i]+A[j]+i-j)

首先要使得 A[i]+i 最大,

然后再求 A[i]+i+A[j]-j 的最大。

如果,A[j]+j > A[i]+i 那么需要更新 i 为 j

 

代码参考:

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

 

posted @ 2020-06-02 14:41  habibah_chang  阅读(164)  评论(0编辑  收藏  举报