zoukankan      html  css  js  c++  java
  • [Swift]LeetCode456. 132模式 | 132 Pattern

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

    Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that i < j < k and ai < ak < aj. Design an algorithm that takes a list of n numbers as input and checks whether there is a 132 pattern in the list.

    Note: n will be less than 15,000.

    Example 1:

    Input: [1, 2, 3, 4]
    
    Output: False
    
    Explanation: There is no 132 pattern in the sequence. 

    Example 2:

    Input: [3, 1, 4, 2]
    
    Output: True
    
    Explanation: There is a 132 pattern in the sequence: [1, 4, 2]. 

    Example 3:

    Input: [-1, 3, 2, 0]
    
    Output: True
    
    Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0].

    给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。

    注意:n 的值小于15000。

    示例1:

    输入: [1, 2, 3, 4]
    
    输出: False
    
    解释: 序列中不存在132模式的子序列。
    

    示例 2:

    输入: [3, 1, 4, 2]
    
    输出: True
    
    解释: 序列中有 1 个132模式的子序列: [1, 4, 2].
    

    示例 3:

    输入: [-1, 3, 2, 0]
    
    输出: True
    
    解释: 序列中有 3 个132模式的的子序列: [-1, 3, 2], [-1, 3, 0] 和 [-1, 2, 0].

    164ms
     1 struct Stack<T> {
     2     var items = [T]()
     3     mutating func push(item: T) {
     4         items.append(item)
     5     }
     6     mutating func pop() -> T {
     7         return items.removeLast()
     8     }
     9     func top() -> T {
    10         return items.last!
    11     }
    12     func empty() -> Bool {
    13         return items.count == 0
    14     }
    15 }
    16 
    17 class Solution {
    18     func find132pattern(_ nums: [Int]) -> Bool {
    19         var third = Int.min
    20         var s = Stack<Int>()
    21         for i in stride(from: nums.count - 1, through: 0, by: -1) {
    22             if nums[i] < third {
    23                 return true
    24             }else {
    25                 while !s.empty() && (nums[i] > s.top()) {
    26                     third = s.top()
    27                     _ = s.pop()
    28                 }
    29                 s.push(item: nums[i])
    30             }
    31         }
    32         return false
    33     }
    34 }

    324ms

     1 class Solution {
     2     func find132pattern(_ nums: [Int]) -> Bool {
     3         var hanoi = Array<Int>.init();
     4         var medNum = Int.min
     5         for index in stride(from: nums.count-1, through: 0, by: -1) {
     6             if nums[index] < medNum {
     7                 return true
     8             } else {
     9                 while (hanoi.count > 0 && hanoi.last! < nums[index]) {
    10                     medNum = hanoi.last!
    11                     hanoi.removeLast()
    12                 }
    13             }
    14             hanoi.append(nums[index])
    15         }
    16         return false
    17     }
    18 }

    1348ms

     1 class Solution {
     2     func find132pattern(_ nums: [Int]) -> Bool {
     3         if nums.count < 3{ 
     4             return false 
     5         }
     6         var newNums = [nums[0]]
     7         for i in 1..<nums.count {
     8             if nums[i] != nums[i-1]{
     9                 newNums.append(nums[i]);
    10             }
    11         }
    12         if newNums.count < 3{ 
    13             return false 
    14         }
    15         var minArr = [newNums[0]]
    16         var min = newNums[0]
    17         for i in newNums{
    18             if i < min{
    19                 min = i
    20             }
    21             minArr.append(min)
    22         }
    23         for i in 1..<newNums.count-1{
    24             let a = minArr[i]
    25             let b = newNums[i]
    26             if a >= b{ 
    27                 continue 
    28             }
    29             for j in (i+1)..<newNums.count{
    30                 let c = newNums[j]
    31                 if c > a && c < b {
    32                     return true
    33                 }
    34             }
    35         }
    36         return false
    37     }
    38 }

    4388ms

     1 class Solution {
     2     func find132pattern(_ nums: [Int]) -> Bool {
     3         if nums.count < 3 {
     4             return false
     5         }
     6         var i = nums.count
     7         var min = nums[i - 1]
     8         while (i > 0) {
     9             min = nums[i - 1]
    10             var j = nums.count
    11             var max = min
    12             while (j > i) {
    13                 let t = nums[j - 1]
    14                 if t > min {
    15                     if max > min {
    16                         if t > max {
    17                             return true
    18                         }else {
    19                             max = t
    20                         }
    21                     }else {
    22                         max = t
    23                     }
    24                 }
    25                 j = j - 1
    26             }
    27             i = i - 1
    28         }
    29         return false
    30     }
    31 }

    6656ms

     1 class Solution {
     2     func find132pattern(_ nums: [Int]) -> Bool {
     3         var n:Int = nums.count
     4         var i:Int = 0
     5         var j:Int = 0
     6         var k:Int = 0
     7         while (i < n) {
     8             while (i < n - 1 && nums[i] >= nums[i + 1])
     9             {
    10                 i += 1
    11             }
    12             j = i + 1;
    13             while (j < n - 1 && nums[j] <= nums[j + 1])
    14             {
    15                  j += 1
    16             }
    17             k = j + 1
    18             while (k < n) {
    19                 if nums[k] > nums[i] && nums[k] < nums[j]
    20                 {
    21                      return true
    22                 }
    23                 k += 1
    24             }
    25             i = j + 1
    26         }
    27         return false
    28     }
    29 }
  • 相关阅读:
    正整数分解质因数
    水仙花数
    键入任意整数,将之从小到大输出
    有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
    输入某年某月某日,判断这一天是这一年的第几天?
    java 日期增加
    oracle数据库 ORA-01461: can bind a LONG value only for insert into a LONG column解决方案
    JAVA实现图片叠加效果
    JAVA_GET请求URL
    sqlserver-触发器-判断更新了哪个字段。
  • 原文地址:https://www.cnblogs.com/strengthen/p/10343200.html
Copyright © 2011-2022 走看看