1. 程式人生 > 實用技巧 >1667. 區間統計(回顧)

1667. 區間統計(回顧)

1667.區間統計

CAT 專屬題目 中文English

給定一個01陣列arr和 一個整數k, 統計有多少區間符合如下條件:

  1. 區間的兩個端點都為 0 (允許區間長度為1)
  2. 區間內 1 的個數不多於k

樣例

樣例 1:

輸入: arr = [0, 0, 1, 0, 1, 1, 0], k = 1
輸出: 7
解釋: [0, 0], [1, 1], [3, 3], [6, 6], [0, 1], [0, 3], [1, 3] (區間 [i,j] 表示下標 i(包括)和下標 j(包括)之間的元素)

樣例 2:

輸入: arr = [1, 1, 1, 0, 0, 1], k = 2
輸出: 3
解釋: [3, 3], [4, 4], [3, 4] (區間 [i,j] 表示下標 i(包括)和下標 j(包括)之間的元素)

注意事項

arr的大小不超過10^5

輸入測試資料(每行一個引數)如何理解測試資料?

同向型雙指標:

class Solution:
    """
    @param arr: the 01 array
    @param k: the limit 
    @return: the sum of the interval
    """
    def intervalStatistics(self, arr, k):
        # Write your code here.
        #首先right走到0的位置,然後left也走到的位置,計算之間1的個數,如果大於k,則left 
+= 1,一直到符合為止 length = len(arr) left, right = 0, 0 numofone = 0 count = 0 while right < length: #首先right走到0的位置 if (arr[right] == 1): numofone += 1 right += 1 continue #然後left走到0的位置
if (arr[left] == 1): numofone -= 1 left += 1 continue #此時right和left均在0的位置,判斷如果numofone大於k,則left走到numofone小於k的時候為止 while numofone > k: if (arr[left] == 1): numofone -= 1 left += 1 #此時numofone滿足條件,如果當前值為0,left = right ,numofone為0,則加1 #如果left != right,則加 + left到right之間為0的個數,即 -numofone,[left, right] count = right - left + 1 + count - numofone right += 1 return count