Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/2271.html
2271. Maximum White Tiles Covered by a Carpet
- Difficulty: Medium.
- Related Topics: Array, Binary Search, Greedy, Sorting, Prefix Sum.
- Similar Questions: Maximum Number of Vowels in a Substring of Given Length.
Problem
You are given a 2D integer array tiles
where tiles[i] = [li, ri]
represents that every tile j
in the range li <= j <= ri
is colored white.
You are also given an integer carpetLen
, the length of a single carpet that can be placed anywhere.
Return the **maximum number of white tiles that can be covered by the carpet**.
Example 1:
Input: tiles = [[1,5],[10,11],[12,18],[20,25],[30,32]], carpetLen = 10
Output: 9
Explanation: Place the carpet starting on tile 10.
It covers 9 white tiles, so we return 9.
Note that there may be other places where the carpet covers 9 white tiles.
It can be shown that the carpet cannot cover more than 9 white tiles.
Example 2:
Input: tiles = [[10,11],[1,1]], carpetLen = 2
Output: 2
Explanation: Place the carpet starting on tile 10.
It covers 2 white tiles, so we return 2.
Constraints:
-
1 <= tiles.length <= 5 * 104
-
tiles[i].length == 2
-
1 <= li <= ri <= 109
-
1 <= carpetLen <= 109
-
The
tiles
are non-overlapping.
Solution (Java, C++, Python)
-
class Solution { public int maximumWhiteTiles(int[][] tiles, int carpetLength) { Arrays.sort(tiles, Comparator.comparingInt(x -> x[0])); int currentCover = Math.min(tiles[0][1] - tiles[0][0] + 1, carpetLength); int maxCover = currentCover; int head = 1; int tail = 0; while (tail < tiles.length && head < tiles.length && maxCover < carpetLength) { if (tiles[head][1] - tiles[tail][0] + 1 <= carpetLength) { currentCover += tiles[head][1] - tiles[head][0] + 1; maxCover = Math.max(maxCover, currentCover); ++head; } else { int possiblePartialCoverOverCurrentHead = carpetLength - (tiles[head][0] - tiles[tail][0]); maxCover = Math.max(maxCover, currentCover + possiblePartialCoverOverCurrentHead); currentCover = currentCover - (tiles[tail][1] - tiles[tail][0] + 1); ++tail; } } return maxCover; } } ############ class Solution { public int maximumWhiteTiles(int[][] tiles, int carpetLen) { Arrays.sort(tiles, (a, b) -> a[0] - b[0]); int n = tiles.length; int s = 0, ans = 0; for (int i = 0, j = 0; i < n; ++i) { while (j < n && tiles[j][1] - tiles[i][0] + 1 <= carpetLen) { s += tiles[j][1] - tiles[j][0] + 1; ++j; } if (j < n && tiles[i][0] + carpetLen > tiles[j][0]) { ans = Math.max(ans, s + tiles[i][0] + carpetLen - tiles[j][0]); } else { ans = Math.max(ans, s); } s -= (tiles[i][1] - tiles[i][0] + 1); } return ans; } }
-
class Solution: def maximumWhiteTiles(self, tiles: List[List[int]], carpetLen: int) -> int: tiles.sort() n = len(tiles) s = ans = j = 0 for i, (li, ri) in enumerate(tiles): while j < n and tiles[j][1] - li + 1 <= carpetLen: s += tiles[j][1] - tiles[j][0] + 1 j += 1 if j < n and li + carpetLen > tiles[j][0]: ans = max(ans, s + li + carpetLen - tiles[j][0]) else: ans = max(ans, s) s -= ri - li + 1 return ans ############ # 2271. Maximum White Tiles Covered by a Carpet # https://leetcode.com/problems/maximum-white-tiles-covered-by-a-carpet/ class Solution: def maximumWhiteTiles(self, tiles: List[List[int]], carpetLen: int) -> int: res = 0 tiles.sort() prefix = [0] for x, y in tiles: prefix.append(prefix[-1] + y - x + 1) startPos = [x for x, _ in tiles] for i, (x, y) in enumerate(tiles): if y - x + 1 >= carpetLen: return carpetLen endIndex = bisect.bisect(startPos, x + carpetLen - 1) - 1 ex, ey = tiles[endIndex] extra = 0 if ey - x + 1 > carpetLen: extra = ey - x - carpetLen + 1 res = max(res, prefix[endIndex + 1] - prefix[i] - extra) return res
-
class Solution { public: int maximumWhiteTiles(vector<vector<int>>& tiles, int carpetLen) { sort(tiles.begin(), tiles.end()); int s = 0, ans = 0, n = tiles.size(); for (int i = 0, j = 0; i < n; ++i) { while (j < n && tiles[j][1] - tiles[i][0] + 1 <= carpetLen) { s += tiles[j][1] - tiles[j][0] + 1; ++j; } if (j < n && tiles[i][0] + carpetLen > tiles[j][0]) { ans = max(ans, s + tiles[i][0] + carpetLen - tiles[j][0]); } else { ans = max(ans, s); } s -= (tiles[i][1] - tiles[i][0] + 1); } return ans; } };
-
func maximumWhiteTiles(tiles [][]int, carpetLen int) int { sort.Slice(tiles, func(i, j int) bool { return tiles[i][0] < tiles[j][0] }) n := len(tiles) s, ans := 0, 0 for i, j := 0, 0; i < n; i++ { for j < n && tiles[j][1]-tiles[i][0]+1 <= carpetLen { s += tiles[j][1] - tiles[j][0] + 1 j++ } if j < n && tiles[i][0]+carpetLen > tiles[j][0] { ans = max(ans, s+tiles[i][0]+carpetLen-tiles[j][0]) } else { ans = max(ans, s) } s -= (tiles[i][1] - tiles[i][0] + 1) } return ans } func max(a, b int) int { if a > b { return a } return b }
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).