Java-LeetCode845. 数组中的最长山脉-onwPass | twoPass

  • 算法:twoPass
    • 1.空间换取时间
    • 2.up数组记录前面有多少个连续比自己小的数,down数组记录后面有多少个连续比自己小的数
    • 3.第二次遍历计算最长山脉长度
public int longestMountain(int[] A) {
    int N = A.length;
    int[] up = new int[N];
    int[] down = new int[N];
    for (int i = 1; i < A.length; i++) {
        if (A[i] > A[i-1]) {
            up[i] = up[i-1] + 1;
        }
        if (A[N-i-1] > A[N-i]) {
            down[N-i-1] = down[N-i] + 1;
        }
    }

    int length = 0;
    for (int i = 1; i < A.length - 1; i++) {
        if (up[i] > 0 && down[i] > 0) {
            length = Math.max(length, up[i] + down[i] + 1);
        }
    }
    return length;
}
  • 算法-onePass
    • 1.遍历每一个元素作为山脉的起始位置,计算山脉的长度
    • 2.下一个山脉的起始位置是上一个山脉的结束位置,优化时间
public int longestMountain(int[] A) {
    int length = 0;
    for (int i = 0; i < A.length - 2; i++) {
        if (A[i+1] > A[i]) {
            int upper = i + 1;
            while (upper + 1 < A.length && A[upper + 1] > A[upper]) {
                upper++;
            }
            int lower = upper + 1;
            if (lower < A.length && A[lower] != A[upper]) {
                while (lower + 1 < A.length && A[lower + 1] < A[lower]) {
                    lower++;
                }
                length = Math.max(length, lower - i + 1);
                i = lower - 1;
            }
        }
    }
    return length;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-25 17:13
点赞 评论 收藏
分享
门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
牛客nb666号:看数据范围, -1e4~1e4, 用一个计数数组存一下, 再按个数让k减到0就行; 堆排不是O(n)的, 快速选择算法是O(n)但随机性较强
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-25 17:46
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务