ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

构造恰好一条路径的网格【力扣LeetCode 每日一题】

构造恰好一条路径的网格【力扣LeetCode  每日一题】

3963. 构造恰好一条路径的网格

网页链接

力扣LeetCode

力扣LeetCode & 每日一题,完成每日打卡,即可获得力扣积分。获得相应数量的积分,能在【力扣商店】,换取相应奖品!助力每日有题做,丰盈积分日益多!


题目描述

给你两个整数m和n,分别表示网格的行数和列数。

请你构造任意一个只包含字符'.'和'#'的m x n网格,其中:

有效路径是满足以下条件的空单元格序列:

返回任意一个从左上角到右下角恰好只有一条有效路径的网格。


输入描述

两个整数m和n,分别表示网格的行数和列数。


输出描述

返回一个m x n的字符串数组,每个字符串仅由'.'和'#'组成,表示满足「从左上角到右下角恰好只有一条有效路径」的网格。多解时返回任意一个均可。


示例 1

输入:

m = 2, n = 3

输出:

[". .#","#.."]

写作网格形式:

. . # # . .

解释:

唯一的有效路径是:(0,0) -> (0,1) -> (1,1) -> (1,2)


示例 2

输入:

m = 3, n = 3

输出:

[". .#","#..","##."]

写作网格形式:

. . # # . . # # .

解释:

唯一的有效路径是:(0,0) -> (0,1) -> (1,1) -> (1,2) -> (2,2)


示例 3

输入:

m = 1, n = 4

输出:

["...."]

解释:

唯一的有效路径是:(0,0) -> (0,1) -> (0,2) -> (0,3)


数据范围

解题思路

本题是构造性贪心问题。题目不要求唯一答案,只需构造一个m × n的网格,使得从左上角(0,0)到右下角(m-1,n-1)、只能向右或向下走的有效路径恰好只有一条。

1. 构造目标

我们希望把整张网格设计成一条“唯一通道”:

换句话说,构造出的唯一路径是:

( 0 , 0 ) → ( 0 , 1 ) → ⋯ → ( 0 , n − 1 ) → ( 1 , n − 1 ) → ⋯ → ( m − 1 , n − 1 ) (0,0)\to(0,1)\to\cdots\to(0,n-1)\to(1,n-1)\to\cdots\to(m-1,n-1)(0,0)→(0,1)→⋯→(0,n−1)→(1,n−1)→⋯→(m−1,n−1)

这条路径先沿着第一行向右走到底,再沿着最后一列向下走到底。

2. 为什么路径唯一

考虑任意一条从(0,0)到(m-1,n-1)的合法路径。

中间没有任何分叉口,所以有效路径恰好只有一条。

3. 代码实现

代码按上述思路构造:

vector<string>r(m);r[0].resize(n,'.');for(inti=1;i<m;i++){r[i].resize(n,'#');r[i][n-1]='.';}

具体来说:

这样得到的网格形如:

. . . ... . # # # ... . # # # ... . ... # # # ... .

其中第一行全为空地,最后一列全为空地,其余位置都是障碍物。

4. 边界情况

这些情况代码都能自然处理。

5. 复杂度分析

总结

把第一行全部设为空地,把最后一列从第二行开始全部设为空地,其余位置全部设为障碍物。这样从左上角出发只能先沿第一行走到最右端,再沿最后一列向下走到右下角,形成唯一一条有效路径。构造简单,且天然满足题目要求。

代码内容

classSolution{public:vector<string>createGrid(intm,intn){vector<string>r(m);r[0].resize(n,'.');for(inti=1;i<m;i++){r[i].resize(n,'#');r[i][n-1]='.';}returnr;}};
返回列表