LeetCode 2209. Minimum White Tiles After Covering With Carpets Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
2209. Minimum White Tiles After Covering With Carpets

Description

You are given a 0-indexed binary string floor, which represents the colors of tiles on a floor:

  • floor[i] = '0' denotes that the ith tile of the floor is colored black.
  • On the other hand, floor[i] = '1' denotes that the ith tile of the floor is colored white.

You are also given numCarpets and carpetLen. You have numCarpets black carpets, each of length carpetLen tiles. Cover the tiles with the given carpets such that the number of white tiles still visible is minimum. Carpets may overlap one another.

Return the minimum number of white tiles still visible.

 

Example 1:

Input: floor = "10110101", numCarpets = 2, carpetLen = 2
Output: 2
Explanation: 
The figure above shows one way of covering the tiles with the carpets such that only 2 white tiles are visible.
No other way of covering the tiles with the carpets can leave less than 2 white tiles visible.

Example 2:

Input: floor = "11111", numCarpets = 2, carpetLen = 3
Output: 0
Explanation: 
The figure above shows one way of covering the tiles with the carpets such that no white tiles are visible.
Note that the carpets are able to overlap one another.

 

Constraints:

  • 1 <= carpetLen <= floor.length <= 1000
  • floor[i] is either '0' or '1'.
  • 1 <= numCarpets <= 1000

Solutions

Solution 1: Memoization Search

We design a function dfs(i, j) to represent the minimum number of white tiles that are not covered starting from index i using j carpets. The answer is dfs(0, numCarpets).

For index i, we discuss the following cases:

  • If i \ge n, it means all tiles have been covered, return 0;
  • If floor[i] = 0, then we do not need to use a carpet, just skip it, i.e., dfs(i, j) = dfs(i + 1, j);
  • If j = 0, then we can directly use the prefix sum array s to calculate the number of remaining uncovered white tiles, i.e., dfs(i, j) = s[n] - s[i];
  • If floor[i] = 1, then we can choose to use a carpet or not, and take the minimum of the two, i.e., dfs(i, j) = min(dfs(i + 1, j), dfs(i + carpetLen, j - 1)).

We use memoization search to solve this problem.

The time complexity is O(n × m), and the space complexity is O(n × m). Here, n and m are the length of the string floor and the value of numCarpets, respectively.

PythonJavaC++GoTypeScriptRust
class Solution: def minimumWhiteTiles(self, floor: str, numCarpets: int, carpetLen: int) -> int: @cache def dfs(i: int, j: int) -> int: if i >= n: return 0 if floor[i] == "0": return dfs(i + 1, j) if j == 0: return s[-1] - s[i] return min(1 + dfs(i + 1, j), dfs(i + carpetLen, j - 1)) n = len(floor) s = [0] * (n + 1) for i, c in enumerate(floor): s[i + 1] = s[i] + int(c == "1") ans = dfs(0, numCarpets) dfs.cache_clear() return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !