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 ...
随机推荐
- mysql常见字符串处理函数
- 偏前端 - div+mui+vue.js 制作问卷调查单页 ——题目答案由后台随机给出10道
封装的ajax获取数据.代码可能有些是多余的,没做处理!!点击提交后有弹框,在这里我没有贴出来.第一次写博客,这些也是别人教我的,经理解后,贴出来于大家分享 ——html—— <script t ...
- PHP程序员学Objective-C之后的变化
趣味坎谈,不一定100%准确,以自己的实际情况为准; 如题,我2008年开始学PHP,PHP是我学的第二门编程语言,一直用到现在,2010年初开始做iOS开发,学习了Objective-C,学这2门语 ...
- Bootstrap04
Bootstrap04概述 一.输入框组 1.左侧添加文字 <div class="input-group"> <span class="input-g ...
- STM32 HAL库学习系列第6篇---定时器TIM 级联配置
应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...
- 嵌入式C语言自我修养 10:内联函数探究
10.1 属性声明:noinline & always_inline 这一节,接着讲 __atttribute__ 属性声明,__atttribute__ 可以说是 GNU C 最大的特色.我 ...
- Keil MDK最新版 5.25介绍及下载地址
看到Keil MDK又出新版咯,分享给大家 Keil MDK-ARM 5.25 uVision5开发工具下载地址:http://www.myir-tech.com/soft.asp?id=1140 K ...
- ImageMagick命令执行学习笔记(常见于图片预览处)
实验版本: ImageMagick版本:6.9.2 push graphic-context viewbox 0 0 640 480 fill 'url(https://"|whoami&q ...
- CRLF注入学习
预备 <CRLF>是换行符,CRLF注入顾名思义就是把换行符写入,那么要把换行符写入到哪里呢?看看下面的http头 可以看到,每一行都包含特定的头部信息,然后以换行为标志写入其他的头部信息 ...
- SQLSERVER字符串处理函数
sqlserver提供了一系列字符串处理函数:substring.left.right.len.charindex.patindex.replace.replicate.stuff.upper.low ...