• [Swift]LeetCode1004. 最大连续1的个数 III | Max Consecutive Ones III


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

    Given an array A of 0s and 1s, we may change up to K values from 0 to 1.

    Return the length of the longest (contiguous) subarray that contains only 1s.  

    Example 1:

    Input: A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
    Output: 6
    Explanation: 
    [1,1,1,0,0,1,1,1,1,1,1]
    Bolded numbers were flipped from 0 to 1.  The longest subarray is underlined.

    Example 2:

    Input: A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
    Output: 10
    Explanation: 
    [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
    Bolded numbers were flipped from 0 to 1.  The longest subarray is underlined. 

    Note:

    1. 1 <= A.length <= 20000
    2. 0 <= K <= A.length
    3. A[i] is 0 or 1 

    给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。

    返回仅包含 1 的最长(连续)子数组的长度。 

    示例 1:

    输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
    输出:6
    解释: 
    [1,1,1,0,0,1,1,1,1,1,1]
    粗体数字从 0 翻转到 1,最长的子数组长度为 6。

    示例 2:

    输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
    输出:10
    解释:
    [0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
    粗体数字从 0 翻转到 1,最长的子数组长度为 10。 

    提示:

    1. 1 <= A.length <= 20000
    2. 0 <= K <= A.length
    3. A[i] 为 0 或 1 

    428ms
     1 class Solution {    
     2     func longestOnes(_ A: [Int], _ K: Int) -> Int {
     3         var left = 0, right = 0, res = 0, zeroCount = 0
     4         
     5         while right < A.count {
     6             if A[right] == 0 { zeroCount += 1 }
     7             right += 1
     8             while(zeroCount > K) {
     9                 if A[left] == 0 { zeroCount -= 1 }
    10                 left += 1
    11             }            
    12             res = max(right - left, res)
    13         }        
    14         return res
    15     }
    16 }

    432ms

     1 class Solution {
     2     func longestOnes(_ A: [Int], _ K: Int) -> Int {
     3         var i = 0, k = K
     4         var result = 0
     5         for j in 0..<A.count {
     6             if A[j] == 0 {
     7                 k -= 1
     8             }
     9             while k < 0 {
    10                 if A[i] == 0 {
    11                     k += 1
    12                 }
    13                 i += 1
    14             }
    15             result = max(result, j - i + 1)
    16         }
    17         return result
    18     }
    19 }

    460ms

     1 class Queue<T>: CustomDebugStringConvertible, CustomStringConvertible {
     2     private var storage: Array<T>
     3     
     4     private var head = 0
     5     private var last = 0
     6     
     7     init(_ capacity: Int) {
     8         storage = Array()
     9         storage.reserveCapacity(capacity)
    10     }
    11     
    12     func isEmpty() -> Bool {
    13         return head == last
    14     }
    15     
    16     func push(_ val: T) {
    17         storage.append(val)
    18         last += 1
    19     }
    20     
    21     func pop() -> T {
    22         head += 1
    23         
    24         return storage[head - 1]
    25     }
    26     
    27     func forEach(_ block: (T)->Void) {
    28         for i in head..<last {
    29             block(storage[i])
    30         }
    31     }
    32     
    33     func first() -> T {
    34         return storage[head]
    35     }
    36     
    37     func count() -> Int {
    38         return last - head
    39     }
    40     
    41     var description: String {
    42         return debugDescription
    43     }
    44     
    45     var debugDescription: String {
    46         var str = "["
    47         forEach { str += "($0)," }
    48         str += "]"
    49         return str
    50     }
    51 }
    52 
    53 
    54 class Solution {
    55     func longestOnes(_ A: [Int], _ K: Int) -> Int {
    56         
    57         let queue = Queue<Int>(A.count)
    58         var current = 0
    59         var ans = 0
    60 
    61         for i in A.indices {
    62             if A[i] > 0 {
    63                 current += 1
    64             } else if queue.count() < K {
    65                 current += 1
    66                 queue.push(i)
    67             } else if K > 0{
    68                 current = i - queue.pop()
    69                 queue.push(i)
    70             }
    71             
    72             ans = max(ans, current)
    73         }
    74         
    75         return ans
    76     }
    77 }

    Runtime: 476 ms

    Memory Usage: 18.9 MB
     1 class Solution {
     2     func longestOnes(_ A: [Int], _ K: Int) -> Int {
     3         var res:Int = 0
     4         var zero:Int = 0
     5         var left:Int = 0
     6         for right in 0..<A.count
     7         {
     8             if A[right] == 0
     9             {
    10                 zero += 1
    11             }
    12             while (zero > K)
    13             {
    14                 if A[left] == 0
    15                 {
    16                     zero -= 1
    17                 }
    18                 left += 1
    19             }
    20             res = max(res, right - left + 1)
    21         }
    22         return res        
    23     }
    24 }

    Runtime: 576 ms

    Memory Usage: 18.9 MB
     1 class Solution {
     2     func longestOnes(_ A: [Int], _ K: Int) -> Int {
     3         var n:Int = A.count
     4         var pre:[Int] = [Int](repeating:0,count:n)
     5         for i in 0..<n
     6         {
     7             if A[i] == 0
     8             {
     9                 pre[i] = 1
    10             }
    11         }
    12         for i in 1..<n
    13         {
    14             pre[i] = pre[i - 1] + pre[i]
    15         }
    16         var fans:Int = 0
    17         for i in -1..<(n - 1)
    18         {
    19             var lo:Int = i + 1
    20             var hi:Int = n - 1
    21             var ans:Int = i
    22             while(lo <= hi)
    23             {
    24                 var mid:Int = (lo + hi) / 2
    25                 var val:Int = pre[mid]
    26                 if i >= 0
    27                 {
    28                     val -= pre[i]
    29                 }
    30                 if val <= K
    31                 {
    32                     ans = mid
    33                     lo = mid + 1
    34                 }
    35                 else
    36                 {
    37                     hi = mid - 1
    38                 }                
    39             }
    40             fans = max(fans, ans - i)
    41         }
    42         return fans    
    43     }
    44 }
  • 相关阅读:
    《Orange'S:一个操作系统的实现》与上一版之比较
    IPC
    末日帝国——Agile公司的困境 (2)
    取经学道真经验——你听过这么享受的培训吗
    数据库设计指南(五)数据库小技巧
    软件项目开发典型风险一览
    数据库设计指南(四)保证数据的完整性
    官网的Ext direct包中.NET版的问题
    软件项目开发应写的13类文档
    面试EJB常考题
  • 原文地址:https://www.cnblogs.com/strengthen/p/10464806.html
Copyright © 2020-2023  润新知