题解 | #金字塔数组#

金字塔数组

http://www.nowcoder.com/practice/c45c060453324a0aa2745c62a2bd1a27

金字塔数组

描述
给定一个长度为n的数组num,数组开始时呈现递增趋势的,到了某一点之后,数组中的值呈现递减趋势,符合这样先增后减规律的数组定义为金字塔数组,求整个num数组中找出长度最长的金字塔数组,如果金字塔数组不存在,请输出0
示例
输入:4,[1,2,3,1]
返回:4
示例
输入:5,[1,5,3,3,1]
返回:3

方法二

思路分析

    本题我一开始想到了接雨水问题,接雨水问题是根据每一位置左右两侧的最高点计算该位置可以承受的雨水,根据金字塔数组的定义:数组开始时呈现递增趋势的,到了某一点之后,数组中的值呈现递减趋势,符合这样先增后减规律的数组,因此在计算金字塔数组的长度,也就是说找到一条曲线(将数组抽象为一条曲线)的所有波谷(每一子序列的最小值),根据波谷即可计算当前金字塔数组的长度。需要注意的是一开始的位置和最后的位置也可能就是波谷,因此需要单独对这两个位置判断,具体过程如下:
  • 如果num[1]>=num[0],那么开始位置为波谷,进行记录
  • 在中间位置上,如果num[i]<=num[i-1]&num[i]<=num[i+1],那么记录i为波谷
  • 结束位置,如果num[n-1]<=num[n-2],那么记录结束位置为波谷
  • 最后将波谷之间的长度进行计算,找到最长的金字塔数组长度

图解

根据给定数组画出折线图,可以很清楚的找到波谷点,然后得到金字塔数组的长度。


核心代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int 
     * @param num intvector 
     * @return int
     */
    int getMaxLength(int n, vector<int>& num) {
        // write code here
        vector<int> temp;
        if(n<1) return 0;
        //首先判断第一个位置是否为最低点
        if(num[0]<=num[1]) temp.push_back(0);
        for(int i=1;i<n-1;i++)
        {
            if(num[i]<=num[i-1]&&num[i]<=num[i+1])
            {
                temp.push_back(i);//记录每一个子段最低点
            }
        }
        if(num[n-1]<=num[n-2]) temp.push_back(n-1);//判断最后位置是否为子段最低
        int max_length=0;
        for(int i=1;i<temp.size();i++)
        {
            max_length=max(max_length,temp[i]-temp[i-1]+1);//两个相邻低点之间即为所求数组长
        }
        return max_length;
        
    }
};

复杂度分析

  • 时间复杂度:时间主要是开销在寻找所有符合条件的波谷点,以及计算波谷点之间的长度,因此时间复杂度为$O(n)$
  • 空间复杂度:需要设置一个存放波谷点的数组,因此空间复杂度最大为$O(n)$

方法二

思路分析

方法二是对方法一的进一步优化,由于题目只需要输出金字塔数组的长度,因此无需使用额外的数组存***谷位置元素,只需要一个变量记录上一个波谷的位置,再找到当前波谷位置时,即可计算出当前金字塔数组的长度,从而节省内存空间。

核心代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int 
     * @param num intvector 
     * @return int
     */
    int getMaxLength(int n, vector<int>& num) {
        // write code here
        if(n<1) return 0;
        int min_index;//记录每一个子段最低点的位置
        int max_length=0;
        //首先判断第一个位置是否为最低点
        if(num[0]<=num[1]) 
        {
            min_index=0;
        }
        for(int i=1;i<n-1;i++)
        {
            if(num[i]<=num[i-1]&&num[i]<=num[i+1])
            {
                max_length=max(max_length,i-min_index+1);
                min_index=i;//令min_index表示当前波谷的上一波谷位置
            }
        }
        if(num[n-1]<=num[n-2]) //判断最后位置是否为子段最低
        {
           max_length=max(max_length,n-1-min_index+1);//如果存在最后一个金字塔数组,将其比较
        }
        return max_length;
        
    }
};

复杂度分析
  • 时间复杂度:该方法的时间复杂度与方法一相同,都是$O(n)$,不过只存在一次循环,要小一些
  • 空间复杂度:空间复杂度相比于方法一减小了,没有设置专门的数组存***谷位置,设置了一个变量存储距离本次波谷最近的波谷位置,因此总的空间复杂度为$O(1)$

全部评论

相关推荐

03-21 10:53
复旦大学 Java
大家好,我是@程序员花海,眼下&nbsp;26&nbsp;届春招、27&nbsp;届暑期实习全面开启,后端卷到没边,AI&nbsp;Agent的岗位占主导,很多牛友在我的评论区留言,想让我出一份Agent学习路线。我特意去看了下,打开淘天的招聘页面,以校招为例,一眼望去全是AI相关的岗位,只能说之后绝大多数岗位都会快速推进AI的落地和实践。之前写过&nbsp;Java&nbsp;后端&nbsp;3&nbsp;个月抢救路线https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users,也收到了牛友们的强烈好评,这次专门给后端转&nbsp;Agent做一套最少必要知识路线——&nbsp;不堆概念、不啃论文,只学面试必问、项目...
在职牛马didi:这篇路线整理得很系统,把后端知识映射到Agent体系这个思路特别实用。我自己也是从Java转做AI的,感触很深:工程底子扎实的人转Agent确实有优势,RAG和工具编排这些核心能力本质上都是后端逻辑的延伸。我们团队在做天猫的AI应用落地,方向跟你这篇路线里的企业级RAG和Agent系统很接近。暑期实习还在招AI应用研发工程师,JD可以参考看看跟你背景是否匹配:https://www.nowcoder.com/jobs/detail/440929?jobId=440929
软件开发投递记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3136次浏览 43人参与
# HR最不可信的一句话是__ #
1021次浏览 32人参与
# 米连集团26产品管培生项目 #
7069次浏览 224人参与
# 春招至今,你的战绩如何? #
14766次浏览 137人参与
# AI面会问哪些问题? #
893次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2704次浏览 52人参与
# 巨人网络春招 #
11484次浏览 224人参与
# 沪漂/北漂你觉得哪个更苦? #
1235次浏览 38人参与
# 你做过最难的笔试是哪家公司 #
1131次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2684次浏览 49人参与
# XX请雇我工作 #
51147次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7966次浏览 43人参与
# 简历第一个项目做什么 #
32073次浏览 357人参与
# 简历中的项目经历要怎么写? #
310908次浏览 4257人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152832次浏览 889人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187556次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64539次浏览 864人参与
# 如果重来一次你还会读研吗 #
229974次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178254次浏览 891人参与
# 你怎么看待AI面试 #
180654次浏览 1296人参与
# 正在春招的你,也参与了去年秋招吗? #
364172次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160822次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务