LeetCode 1014. 最佳观光组合

1014. 最佳观光组合

题目分析

这个题一开始我也没看懂怎么做,但是我知道暴力是可以解出来的,就尝试写了暴力写法,但是TLE了。
后来静下来仔细分析。我们在这个过程中需要寻找的是最大的两个值去进行比较。
我就依照这个思路做了第一版答案,发现这个思想是错的,因为两个最大值之间的距离可能非常的大,甚至不如它们之间的某个值与右手边的值得出来的答案大。
然后我就连续得了几个WA,心里拔凉拔凉的。
后来在判断上继续更新了下条件,就是加上了判断如果两个数值之差比距离之差还小的话,也要进行左边的浮标右移。得出的代码如下

代码

暴力法

    /**
     * LC 1014. 最佳观光组合。
     * 解法一:暴力法,超时
     * @param A
     * @return
     */
    public int maxScoreSightseeingPair1(int[] A) {
        int max = 0;
        for (int i = 0; i < A.length; i++) {
            for (int j = i + 1; j < A.length; j++) {
                if ((A[i] + A[j] + i - j) > max) {
                    max = A[i] + A[j] + i - j;
                }
            }
        }
        return max;
    }

贪心思想

    public int maxScoreSightseeingPair2(int[] A) {
        int res = 0;
        int temp = A[0];
        int lastIndex = 0;
        for (int i = 1; i < A.length; i++) {
            res = Math.max(temp + A[i] + lastIndex - i, res);
            if ((Math.abs(temp - A[i]) <= (i - lastIndex) || temp <= A[i])) {
                temp = A[i];
                lastIndex = i;
            }
        }
        return res;
    }

更加易懂的贪心思想

    public int maxScoreSightseeingPair(int[] A) {
        int res = 0;
        int temp = A[0];
        for (int i = 1; i < A.length; i++) {
            res = Math.max(temp + A[i] - i, res);
            //如果两个景点评分之差比距离之差还要小,就要将上一个选取的景点移动到当前景点上。
            //同时遇到大于等于评分的景点也要往前移动,我们需要取得是最大值。
            temp = Math.max(temp, A[i] + i);
        }
        return res;
    }
posted @ 2020-06-17 10:39  ZJPang  阅读(128)  评论(0编辑  收藏  举报