LeetCode 845——数组中的最长山脉
1. 题目

2. 解答
2.1 方法一
left 数组表示当前元素左边比当前元素小的元素个数,right 数组数组表示当前元素右边比当前元素小的元素个数。在山脉的中间 B[i] 处,其左边和右边肯定都有小于 B[i] 的元素,而山脉的长度即为 left[i] + right[i] + 1。
class Solution {
public:
    int longestMountain(vector<int>& A) {
        int n = A.size();
        if (n < 3)    return 0;
        vector<int> left(n, 0);
        vector<int> right(n, 0);
        for (int i = 1; i < n; i++)
        {
            if (A[i] > A[i-1])  left[i] = left[i-1] + 1;
        }
        for (int i = n-2; i >= 0; i--)
        {
            if (A[i] > A[i+1])  right[i] = right[i+1] + 1;;
        }
        int len = 0;
        for (int i = 0; i < n; i++)
        {
            if (left[i] != 0 && right[i] != 0)
                len = max(len, left[i] + right[i] + 1);
        }
        return len;
    }
};
2.2 方法二
max_than_left 数组若为 1 则表明当前元素比左边元素大,max_than_right 数组若为 1 则表明当前元素比右边元素大。
若为山脉则两个数组应该为如下序列
| 数组取值 | |||||
|---|---|---|---|---|---|
| max_than_left | 1(可选) | ... | 1(必选) | ... | 0(可选) | 
| max_than_right | 0(可选) | ... | 1(必选) | ... | 1(可选) | 
class Solution {
public:
    int longestMountain(vector<int>& A) {
        int n = A.size();
        if (n < 3)    return 0;
        vector<int> max_than_left(n, 0);
        vector<int> max_than_right(n, 0);
        for (int i = 1; i < n; i++)
        {
            if (A[i] > A[i-1])  max_than_left[i] = 1;
        }
        for (int i = 0; i < n-1; i++)
        {
            if (A[i] > A[i+1])  max_than_right[i] = 1;
        }
        int result = 0;
        int len = 0;
        int left_flag = 0;
        int middle_flag = 0;
        int right_flag = 0;
        for (int i = 0; i < n; i++)
        {
            if (max_than_left[i] == 1 && max_than_right[i] == 0)
            {
                if (left_flag)  result++;
                else
                {
                    result = 3;
                    left_flag = 1;
                }
            }
            else if (max_than_left[i] == 1 && max_than_right[i] == 1)
            {
                if (left_flag)
                {
                    result++;
                }
                else
                {
                    result = 3;
                }
                left_flag = 0;
                middle_flag = 1;
            }
            else if (max_than_left[i] == 0 && max_than_right[i] == 1)
            {
                if (right_flag) result++;
                if (middle_flag)
                {
                    middle_flag = 0;
                    right_flag = 1;
                    result++;
                }
            }
            else
            {
                right_flag = 0;
                middle_flag = 0;
                left_flag = 0;
                result = 0;
            }
            if (middle_flag || right_flag) len = max(len, result);
        }
        return len;
    }
};
获取更多精彩,请关注「seniusen」!

LeetCode 845——数组中的最长山脉的更多相关文章
- [Swift]LeetCode845. 数组中的最长山脉 | Longest Mountain in Array
		Let's call any (contiguous) subarray B (of A) a mountain if the following properties hold: B.length ... 
- Longest Mountain in Array 数组中的最长山脉
		我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”: B.length >= 3 存在 0 < i < B.length - 1 使得 B[0] < B[1] ... 
- LeetCode:数组中的第K个最大元素【215】
		LeetCode:数组中的第K个最大元素[215] 题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: ... 
- LeetCode 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
		Given an unsorted array of integers, find the length of the longest consecutive elements sequence.Fo ... 
- LeetCode 421. 数组中两个数的最大异或值(Maximum XOR of Two Numbers in an Array) 71
		421. 数组中两个数的最大异或值 421. Maximum XOR of Two Numbers in an Array 题目描述 给定一个非空数组,数组中元素为 a0, a1, a2, - , a ... 
- LeetCode 442. 数组中重复的数据(Find All Duplicates in an Array) 17
		442. 数组中重复的数据 442. Find All Duplicates in an Array 题目描述 Given an array of integers, 1 ≤ a[i] ≤ n (n ... 
- LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)
		这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961).在大小为2N的数组A中,存在N+1个唯一元素,并且这些元 ... 
- [LeetCode]215. 数组中的第K个最大元素(堆)
		题目 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出 ... 
- Leetcode 215. 数组中的第K个最大元素 By Python
		在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ... 
随机推荐
- Hdu 5052 Yaoge’s maximum profit(树链剖分)
			题目大意: 给出一棵树.每一个点有商店.每一个商店都有一个价格,Yaoge每次从x走到y都能够在一个倒卖商品,从中得取利益.当然,买一顶要在卖之前.可是没次走过一条路,这条路上的全部商品都会添加一个v ... 
- STM32启动代码分析
			STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在<<STM32不完全手册里面>>,我们所有的例程都采用了一个叫STM32F10x.s的启动文 ... 
- 多线程系列之 java多线程的个人理解(二)
			前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ... 
- CentOS7 安装 Docker 以及 Shipyard管理端
			简介: Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单.容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止. Docker 帮助系统管理员和程序员在容器中开发应用 ... 
- MySQL的笔记
			一. SELECT tmp2.name,tmp2.browseNum FROM (SELECT tmp.`name`, COUNT(tmp.id) AS browseNum FROM(SELECT ... 
- Java并发编程(六)原子性与易变性
			原子性 原子是最小单元.不可再分的意思.原子性是指某个操作在获取CPU时间时,要么就给它足够时间,让这个操作执行完,要么就不执行这个操作,执行时不能出现上下文切换(把CPU时间从一个线程分配到另一个线 ... 
- activemq的高级特性:消息的可靠性
			高级特性之消息的可靠性 可靠性分为:生产者.消费者.生产者必须让mq收到消息,消费者必须能够接收到消息并且消费成功,这就是消息的可靠性. 1:生产者可靠性 Session session = conn ... 
- 追溯了解Ubuntu之------基本命令操作(叁)
			在使用Ubuntu中的一些基本命令与Linux中是有区别的: 1. 查看Ubuntu系统位数:uname -ar 或 getconf LONG_BIT 2. 获取Ubu ... 
- redis应用场景:实现简单计数器-防止刷单
			redis应用场景:实现计数器-防止刷单 最近由于双11要来临,公司需要在接口请求上,做一下并发限制的处理,或者做一个防止刷单的安全拦截:比如:一个接口请求,限制每秒请求总数为200次,超过200次就 ... 
- Python + 百度Api 通过地址关键字获得格式化的地址信息
			由于用户输入是千奇百怪的,除了格式语法不合要求之外的,即便是所谓的合法数据也是五花八门.尤其是地址,所有才由此文. 百度Api注册一个账号,创建一个应用后就会有一个`ak`的参数,就够了. Pytho ... 
