Skip to content

Latest commit

 

History

History
 
 

2271.Maximum-White-Tiles-Covered-by-a-Carpet

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

2271.Maximum-White-Tiles-Covered-by-a-Carpet

本题有非常直观的一种方案。我们放毯子,必然会把毯子的左边界和某一段tile的左边界对齐,以最大化毯子的覆盖(或者说最小化毯子的浪费)。假想我们把毯子的左边界与某tile的中段对齐,直觉上我们不妨将毯子再往左边拉一拉:这个过程中我们本质上,挪用了一部分毯子右侧的空间来覆盖了左边一部分瓷砖,而这个操作肯定是不亏的,甚至还可能赚(因为毯子右侧有可能覆盖的是空隙)。

所以本题我们只要逐一考察毯子的左边界应该对齐哪个tile的左边界即可。在这个过程中,毯子的右边界的位置自然也是单调递增的。所以本题就是维护一个双指针的滑窗。

假设毯子的左边界对应的是tiles[i][0],那么我们向右移动指针j来定位毯子右边界解出的是哪个tile,直至tiles[i][0]+carpetLen-1 < tiles[j][1]。如图

carpet ____________________________
 tiles _____  ________ ________  _______
         i                           j

此时tiles[i: j-1]这部分的瓷砖是完全被覆盖的,我们可以用前缀和之差来计算这些tiles的瓷砖总数。另外我们需要计算第j个tile被额外覆盖了多少,这也容易得到:tiles[i][0]+carpetLen-1 - tiles[j][0] + 1. 两部分相加就是地毯在这个位置的覆盖面积。

随着地毯移动n次,取全局的最大值即可。