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 ...
随机推荐
- ASP.NET Core AD 域登录 (转载)
在选择AD登录时,其实可以直接选择 Windows 授权,不过因为有些网站需要的是LDAP获取信息进行授权,而非直接依赖Web Server自带的Windows 授权功能. 当然如果使用的是Azure ...
- [iOS]UIDynamicAnimator动画
创建动画 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 协议代理 ...
- Xcode缓存数据清除
1. 移除 APP 打包的ipa历史版本(Archives) 不可恢复,就是你打的包,如果需要dysm文件,及时备份 路径:~/Library/Developer/Xcode/Archives 2. ...
- 《算法竞赛进阶指南》0x10 基本数据结构 Hash
Hash的基本知识 字符串hash算法将字符串看成p进制数字,再将结果mod q例如:abcabcdefg 将字母转换位数字(1231234567)=(1*p9+2*p8+3*p7+1*p6+2*p5 ...
- laravel artisan 命令列表
5.4版本新增 命令 说明 备注 php artisan make:resource ? 创建api返回格式化资源 >=5.4版本可用 php artisan make:rule ? 创建val ...
- 大数据学习--day16(集合总体架构--ArrayList--LinkedList)
集合总体架构--ArrayList--LinkedList Collection接口的实现类用法上都有相似的方法.Map同理. List: 特性 : 1. 有索引 2. 有序 ...
- HIVE基本语法以及HIVE分区
HIVE小结 HIVE基本语法 HIVE和Mysql十分类似 建表规则 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name da ...
- Docker部署大型互联网电商平台
1.Docker简介 1.1虚拟化 1.1.1什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器.网络.内存及存储等,予以抽象 ...
- SQL学习笔记:分块提取查询结果
实践中,数据库中可能有数十亿条记录.查询结果有可能达到千万条.如果用dbGetQuery( ) 一次性取出所有查询结果,内存可能吃不消.但是,如果容许分块处理数据来完成任务,那么下述方法不失为一个好的 ...
- python2.7入门---GUI编程(Tkinter)
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 . ...