zoukankan      html  css  js  c++  java
  • 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;
        }
    
  • 相关阅读:
    mac iterm2配置
    Test注解的两个属性(转)
    稳定排序和不稳定排序(转)
    [转]异步机制与异步原理
    Flex学习笔记
    [转]有道云笔记markdown
    H5调试
    react生命周期方法
    ESLint 代码检查规范
    REST API
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13151074.html
Copyright © 2011-2022 走看看