• [Swift]LeetCode845. 数组中的最长山脉 | Longest Mountain in Array


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址: https://www.cnblogs.com/strengthen/p/10590282.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Let's call any (contiguous) subarray B (of A) a mountain if the following properties hold:

    • B.length >= 3
    • There exists some 0 < i < B.length - 1 such that B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]

    (Note that B could be any subarray of A, including the entire array A.)

    Given an array A of integers, return the length of the longest mountain. 

    Return 0 if there is no mountain.

    Example 1:

    Input: [2,1,4,7,3,2,5]
    Output: 5
    Explanation: The largest mountain is [1,4,7,3,2] which has length 5.
    

    Example 2:

    Input: [2,2,2]
    Output: 0
    Explanation: There is no mountain.
    

    Note:

    1. 0 <= A.length <= 10000
    2. 0 <= A[i] <= 10000

    Follow up:

    • Can you solve it using only one pass?
    • Can you solve it in O(1) space?

    我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:

    • B.length >= 3
    • 存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]

    (注意:B 可以是 A 的任意子数组,包括整个数组 A。)

    给出一个整数数组 A,返回最长 “山脉” 的长度。

    如果不含有 “山脉” 则返回 0。 

    示例 1:

    输入:[2,1,4,7,3,2,5]
    输出:5
    解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
    

    示例 2:

    输入:[2,2,2]
    输出:0
    解释:不含 “山脉”。 

    提示:

    1. 0 <= A.length <= 10000
    2. 0 <= A[i] <= 10000

    156ms
     1 class Solution {
     2     func longestMountain(_ A: [Int]) -> Int {
     3         var longest = 0
     4         var increasing = true
     5         var mountainLength = 0
     6         var hasReturn = false
     7         var i = 0 
     8         while  i < A.count - 1{
     9             if increasing {
    10                 if A[i] < A[i+1] {
    11                     i += 1
    12                     mountainLength += 1
    13                 }else if A[i] > A[i+1] {
    14                     increasing = false
    15                 }else {
    16                     i += 1
    17                     mountainLength = 0
    18                 }
    19             }else {
    20                 if mountainLength == 0 {
    21                      if A[i] >= A[i+1] {
    22                         i += 1
    23                     }else {
    24                          increasing = true
    25                     }
    26                 }else {
    27                     if A[i] > A[i+1] {
    28                         hasReturn = true
    29                         i += 1
    30                         mountainLength += 1
    31                     }else {
    32                         longest = max(longest, mountainLength + 1)
    33                         mountainLength  = 0
    34                         increasing = false
    35                     }
    36                 }
    37             }
    38         }
    39         if hasReturn {
    40             return max(longest, mountainLength + 1)
    41         }else {
    42             return longest
    43         }
    44     }
    45 }

    Runtime: 164 ms

    Memory Usage: 19.3 MB
     1 class Solution {
     2     func longestMountain(_ A: [Int]) -> Int {
     3         var N:Int = A.count
     4         var res:Int = 0
     5         var up:[Int] = [Int](repeating:0,count:N)
     6         var down:[Int] = [Int](repeating:0,count:N)
     7         for i in stride(from:N - 2,through:0,by:-1)
     8         {
     9             if A[i] > A[i + 1]
    10             {
    11                 down[i] = down[i + 1] + 1
    12             }
    13         }
    14         for i in 0..<N
    15         {
    16             if i > 0 && A[i] > A[i - 1]
    17             {
    18                 up[i] = up[i - 1] + 1
    19             }
    20             if up[i] > 0 && down[i] > 0
    21             {
    22                 res = max(res, up[i] + down[i] + 1)
    23             }
    24         }
    25         return res
    26     }
    27 }

    168ms

     1 class Solution {
     2     func longestMountain(_ A: [Int]) -> Int {
     3         if (A.count < 3) {
     4             return 0
     5         }
     6         var l2r = Array(repeating: 0, count: A.count)
     7         var r2l = Array(repeating: 0, count: A.count)
     8         
     9         for i in 1..<A.count {
    10             if A[i] > A[i-1] {
    11                 l2r[i] = l2r[i-1] + 1
    12             }
    13         }
    14         
    15         for i in stride(from: A.count - 2, through: 1, by: -1) {
    16             if A[i] > A[i+1] {
    17                 r2l[i] = r2l[i+1] + 1
    18             }
    19         }
    20         
    21         var result = 0
    22         for i in 1..<A.count {
    23             if (l2r[i] > 0 && r2l[i] > 0) {
    24                 result = max(result, l2r[i] + r2l[i] + 1)
    25             }
    26         }
    27         
    28         return result 
    29     }
    30 }
  • 相关阅读:
    Spring学习总结[1]-入门
    MyBatis学习总结[5]-动态 SQL
    MyBatis学习总结[4]-ResultMap子元素
    MyBatis学习总结[3]-多表查询
    MyBatis学习总结[2]-接口式调用
    MyBatis学习总结[1]-入门
    Bootstrap table两种分页示例
    spring ioc原理(看完后大家可以自己写一个spring)
    Junit4单元测试
    数字转换为字母有多少种方式
  • 原文地址:https://www.cnblogs.com/strengthen/p/10590282.html
Copyright © 2020-2023  润新知