Leetcode # 683. K Empty Slots
- 2025.06.24
- Sliding Window
Problem
https://leetcode.com/problems/k-empty-slots
What I Tried
[Time Limit Exceeded  27 / 61 testcases passed]
Time Complexity: O(len(bulbs) ** 2)
Space Complexity: O(len(bulbs)) 
(The input and output generally do not count towards the space complexity.)
class Solution:
  def kEmptySlots(self, bulbs: List[int], k: int) -> int:
    segments = [[1, len(bulbs)]]
    for i, x in enumerate(bulbs):
      for j, segment in enumerate(segments):
        if x >= (start := segment[0]) \
            and x <= (end := segment[1]):
          new_segments = [[a, b] \
            for a, b in [[start, x - 1], [x + 1, end]] \
            if a <= b
          ]
          for a, b in new_segments:
            if b - a + 1 == k:
              if a == 1 or b == len(bulbs): continue
              return i + 1
          segments = segments[:j] + new_segments + segments[j + 1:]
    return -1
Time Complexity: O(len(bulbs) ** 2)
Space Complexity: O(len(bulbs)) 
(The input and output generally do not count towards the space complexity.)
class Solution:
  def kEmptySlots(self, bulbs: List[int], k: int) -> int:
    turned_on = set()
    for i, x in enumerate(bulbs):
      first_exists = (first := x - k - 1) in turned_on
      final_exists = (final := x + k + 1) in turned_on
      if first_exists or final_exists:
        blocks = [
          y for y in turned_on \
          if (first_exists and y > first and y < x) \
          or (final_exists and y > x and y < final)
        ]
        if not blocks:
          return i + 1
        
      turned_on.add(x)
    return -1
Solution: Sliding Window
days[i] := the day ith bulb was turned on
- sliding windows: (left, right := left + (k + 1))
- find min([max(days[i], days[i + (k + 1)]) 
 for i in range(1, len(days) – k)
 if all([days[j] > days[i] and days[j] > days[i + (k + 1)] for j in range(i + 1, i + (k + 1))])
 ])
⭐ 用 for … + if … else … 達成 all(… for …)
for ...:
  if not condition:
    ....
    break
else: ...
≡ all(condition for ...)
⚠️ 注意!
if和else的縮排不同
只有在for裡所有if都沒有被觸發,才會在最後一次的if執行else
Code
Time Complexity: O(len(bulbs))
Space Complexity: O(len(bulbs)) 
(The input and output generally do not count towards the space complexity.)
class Solution:
  def kEmptySlots(self, bulbs: List[int], k: int) -> int:
    days = [0] * len(bulbs)
    for i, x in enumerate(bulbs, 1):
      days[x - 1] = i
    ans = float('inf')
    left, right = 0, k + 1
    print(days)
    while right < len(days):
      max_day = max(days[left], days[right])
      for i in range(left + 1, right):
        if days[i] < max_day:
          left = i
          break
      else:
        ans = min(ans, max_day)
        left = right
      right = left + k + 1
    return ans if ans < float('inf') else -1
Last Updated on 2025/06/24 by A1go
 
	
           
  