zoukankan      html  css  js  c++  java
  • 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」!

  • 相关阅读:
    OpenGL红宝书例子2.2 uniform变量的使用
    感冒了。。。
    OpenGL红宝书第一个例子:绘制两个三角形
    从今日起,我会把OpenGL红宝书上的例子用完整的代码形式写在我的博客中,
    win8.1下安装ubuntu 14.0 4LTS
    windows下编译Android版本的boost库文件
    cocos2d-x中使用tinyxml遇到的问题及解决
    为申请texturepacker用
    安装MSYS2过程遇到的问题及解决记录
    Lua 基础 -- 学习笔记
  • 原文地址:https://www.cnblogs.com/seniusen/p/10607833.html
Copyright © 2011-2022 走看看