列表

详情


LCP 70. 沙地治理

在力扣城的沙漠分会场展示了一种沙柳树,这种沙柳树能够将沙地转化为坚实的绿地。 展示的区域为正三角形,这片区域可以拆分为若干个子区域,每个子区域都是边长为 1 的小三角形,其中第 i 行有 2i - 1 个小三角形。

初始情况下,区域中的所有位置都为沙地,你需要指定一些子区域种植沙柳树成为绿地,以达到转化整片区域为绿地的最终目的,规则如下:

现要将一片边长为 size 的沙地全部转化为绿地,请找到任意一种初始指定 最少 数量子区域种植沙柳的方案,并返回所有初始种植沙柳树的绿地坐标。

示例 1:

输入:size = 3 输出:[[1,1],[2,1],[2,3],[3,1],[3,5]] 解释:如下图所示,一种方案为: 指定所示的 5 个子区域为绿地。 相邻至少两片绿地的 (2,2),(3,2) 和 (3,4) 演变为绿地。 相邻两片绿地的 (3,3) 演变为绿地。 image.png{:width=500px}

示例 2:

输入:size = 2 输出:[[1,1],[2,1],[2,3]] 解释:如下图所示: 指定所示的 3 个子区域为绿地。 相邻三片绿地的 (2,2) 演变为绿地。 image.png{:width=276px}

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<vector<int>> sandyLandManagement(int size) { } };

golang 解法, 执行用时: 124 ms, 内存消耗: 39.1 MB, 提交时间: 2023-07-04 09:47:03

func sandyLandManagement(n int) [][]int {
    ans := [][]int{}
    for i := 1; i < n; i++ {
        for j := 1; j <= i * 2 - 1; j += 4 {
            ans = append(ans, []int{i, j})
        }
    }
    ans = append(ans, []int{n, 1})
    
    if n > 1 {
        ans = append(ans, []int{n, n * 2 - 1})
    }
    
    for i := 4; i < n * 2 - 1; i += 8 {
        ans = append(ans, []int{n, i})
    }
    
    for i := 7; i < n * 2 - 1; i += 8 {
        ans = append(ans, []int{n, i})
    }
    
    for i := 9; i < n * 2 - 1; i += 8 {
        ans = append(ans, []int{n, i})
    }
    
    return ans
}

python3 解法, 执行用时: 132 ms, 内存消耗: 53.6 MB, 提交时间: 2023-07-04 09:41:39

# 按规律构造
def gen(tp: int, num: int):
    if num == 1:
        yield [1, 1]
    elif tp == 0:
        for j in range(1, num * 2, 2):
            yield [num, j]
    elif tp == 1:
        yield [num, 2]
    elif tp == 2:
        for j in range(3, num * 2, 2):
            yield [num, j]
    elif tp == 3:
        yield [num, 1]

class Solution:
    def sandyLandManagement(self, N: int) -> List[List[int]]:
        return list(chain.from_iterable(gen((N - num) & 3, num) for num in range(1, N + 1)))

python3 解法, 执行用时: 136 ms, 内存消耗: 56.9 MB, 提交时间: 2023-07-04 09:41:09

# 按规律构造
book = [[],
    [[1,1]],
    [[1,1],[2,1],[2,3]],
    [[1,1],[2,1],[3,1],[3,3],[3,5]],
    [[1,1],[2,3],[3,2],[4,1],[4,3],[4,5],[4,7]]
]

class Solution:
    def sandyLandManagement(self, size: int) -> List[List[int]]:
        if size <= 4: return deepcopy(book[size])
        res = self.sandyLandManagement(size - 4)
        for i in range(size): res.append([size, i * 2 + 1])
        res.append([size - 1, 2])
        for i in range(1, size - 2): res.append([size - 2, i * 2 + 1])
        res.append([size - 3, 1])
        return res

javascript 解法, 执行用时: 380 ms, 内存消耗: 89.8 MB, 提交时间: 2023-07-04 09:40:13

/**
 * @param {number} size
 * @return {number[][]}
 */
var sandyLandManagement = function(size) {
    if(size<4){  //size=1-3,直接返回
        return [[[1,1]],[[1,1],[2,1],[2,3]],[[1,1],[2,1],[2,3],[3,1],[3,5]]][size-1]
    }
    let res = [[1,1]]
    for(let i = 2;i<=size;i++){
        let y = (size-i)%4  //根据规律选择添加方式
        if(y===0){
            for(let j = 1;j<2*i;j+=2){
                res.push([i,j])
            }
        }else if(y===1){
            res.push([i,2])
        }else if(y===2){
            for(let j = 3;j<2*i;j+=2){
                res.push([i,j])
            }
        }else if(y===3){
            res.push([i,1])
        }
    }
    return res
};

python3 解法, 执行用时: 148 ms, 内存消耗: 52.6 MB, 提交时间: 2023-07-04 09:39:27

class Solution:
    def sandyLandManagement(self, size: int) -> List[List[int]]:
        ans = []
        for i in range(1, size):
            for j in range(1, i * 2, 4):
                ans.append([i, j])
            
        ans.append([size, 1])
        if size > 1:
            ans.append([size, size * 2 - 1]);
        for i in range(4, size * 2 - 1, 8):
            ans.append([size, i]);
        for i in range(7, size * 2 - 1, 8):
            ans.append([size, i])
        for i in range(9, size * 2 - 1, 8):
            ans.append([size, i])
        return ans

cpp 解法, 执行用时: 104 ms, 内存消耗: 52 MB, 提交时间: 2023-07-04 09:30:51

/**
 * 找规律,标记(n^2+3*n+2)/4个三角形
 **/
class Solution {
public:
    vector<vector<int>> sandyLandManagement(int n) {
        vector<vector<int>> ans;
        for (int i = 1; i < n; i++) for (int j = 1; j <= i * 2 - 1; j += 4) ans.push_back({i, j});
        ans.push_back({n, 1});
        if (n > 1) ans.push_back({n, n * 2 - 1});
        for (int i = 4; i < n * 2 - 1; i += 8) ans.push_back({n, i});
        for (int i = 7; i < n * 2 - 1; i += 8) ans.push_back({n, i});
        for (int i = 9; i < n * 2 - 1; i += 8) ans.push_back({n, i});
        return ans;
    }
};

上一题