1667. 區間統計(回顧)
阿新 • • 發佈:2020-08-16
1667.區間統計
中文English給定一個01陣列arr
和 一個整數k
, 統計有多少區間符合如下條件:
- 區間的兩個端點都為 0 (允許區間長度為1)
- 區間內 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