【LeetCode】675. 为高尔夫比赛砍树
675. 为高尔夫比赛砍树
- 题目大意
- 思路
- 代码
- 复杂度
原题链接: 675. 为高尔夫比赛砍树
题目大意
你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n
的矩阵表示, 在这个矩阵中:
0
表示障碍,无法触碰
1
表示地面,可以行走
比1
大的数 表示有树的单元格,可以行走,数值表示树的高度
每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。
你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。
你将从(0, 0)
点开始工作,返回你砍完所有树需要走的最小步数
。 如果你无法砍完所有的树,返回-1
。
可以保证的是,没有两棵树的高度是相同的,并且你至少需要砍倒一棵树。
示例:
输入:
[ [1,2,3],[0,0,4],[7,6,5]]
输出: 6
输入:
[ [1,2,3],[0,0,0],[7,6,5]]
输出: -1
输入:
[ [2,3,4],[0,0,5],[8,7,6]]
输出: 6
解释: (0,0) 位置的树,你可以直接砍去,不用算步数。
思路
只要是g[i][j]大于等于1即可走,不管是否已经砍过,因此可先对所有树的高度排序,然后依次计算距离,累加距离为答案。若中间存在某两棵树之间无法达到,则答案为-1。
- 开一个数组,从低到高排序树的高度 O(nmlog(nm))
- 遍历该数组,依次计算两棵树之间的最短距离 O(nm * nm)
代码
class Solution {public:struct Tree{int x, y, h;bool operator< (const Tree& t) const{return h < t.h;}};vector<vector<int>> g;int n, m;int bfs(Tree start, Tree end){// 没有两棵树的高度是相同,当起始点{0, 0}有树时返回0if(start.x == end.x && start.y == end.y) return 0; // 开始求最短路const int INF = 0x3f3f3f3f;vector<vector<int>> dist(n, vector(m, INF));dist[start.x][start.y] = 0;queue<Tree> q; // 队列用于存位置x,yq.push({start.x, start.y, start.h}); // q.push(start);int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};while(q.size()){auto t = q.front();q.pop();for(int i = 0; i < 4; i ++ ){int x = t.x + dx[i], y = t.y + dy[i];if(x >= 0 && x < n && y >= 0 && y < m && g[x][y]){if(dist[x][y] > dist[t.x][t.y] + 1){dist[x][y] = dist[t.x][t.y] + 1;if(x == end.x && y == end.y) return dist[x][y];q.push({x, y});}} }}return -1;}int cutOffTree(vector<vector<int>>& forest) {g = forest;n = g.size(), m = g[0].size();vector<Tree> trs;for(int i = 0; i < n; i ++ )for(int j = 0; j < m; j ++ ){if(g[i][j] > 1){trs.push_back({i, j, g[i][j]});}}sort(trs.begin(), trs.end());Tree last = {0, 0};int res = 0;for(auto& tr : trs){int t = bfs(last, tr);if(t == -1) return -1;res += t;last = tr;}return res;}
};
复杂度
时间复杂度:O(n2m2)O(n^2m^2)O(n2m2)
空间复杂度:O(nm)O(nm)O(nm)
【LeetCode】675. 为高尔夫比赛砍树相关推荐
- Leetcode 675. 为高尔夫比赛砍树 C++
Leetcode 675. 为高尔夫比赛砍树 题目 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比 ...
- leetcode 675. 为高尔夫比赛砍树——(每日一难day29)
675. 为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数 表示有树的单 ...
- golang力扣leetcode 675.为高尔夫比赛砍树
675.为高尔夫比赛砍树 675.为高尔夫比赛砍树 题解 代码 675.为高尔夫比赛砍树 675.为高尔夫比赛砍树 题解 题目:给一个二维矩阵,0不能走,1是陆地,2+是树,1和1往上都能走,从0,0 ...
- LeetCode 675. 为高尔夫比赛砍树
675. 为高尔夫比赛砍树 [BFS]其实这个就是把点按照从小到大的顺序排序,然后BFS算出相邻点的距离累加起来,需要注意要从(0,0)开始走,所以一开始就加入一个(0,0,1)这样即使开始的最小值在 ...
- Leetcode 675.为高尔夫比赛砍树
为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高 ...
- 【宫水三叶的刷题日记】675. 为高尔夫比赛砍树(困难)
题目描述 这是 LeetCode 上的 675. 为高尔夫比赛砍树 ,难度为 困难. Tag : 「图论 BFS」.「AStar 算法」.「启发式搜索」.「并查集」 你被请来给一个要举办高尔夫比赛的树 ...
- 675 为高尔夫比赛砍树(宽搜)
1. 问题描述: 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数表示有树的单元格,可以行 ...
- 675. 为高尔夫比赛砍树 bfs
你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高度. 你被要求按照 ...
- LeetCode--[广度优先搜索]675. 为高尔夫比赛砍树
你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高度. 你被要求按照 ...
最新文章
- aws java mysql_AWS Serverless部署java api(RDS for MySQL篇)
- asp.net的dropDownlist只显示第一个字
- Java多线程之单例模式在多线程环境下的安全问题
- SSO的几种跨域方案
- SQL查询语句-返回名称的分类
- 2022年低压电工题库及模拟考试
- android+京东分类菜单,Android仿京东商品分类
- 手机 html宽度超出屏幕,解决华为手机用rem单位,内容超出屏幕宽度问题
- python自动办公pdf_python自动化办公之 Python 解析 PDF
- python实现批量图片格式转换
- Chrome电脑免安装多个浏览器版本号共存
- Tomcat8.5后版本不返回200 OK的问题解决
- Java面向对象程序设计(四)-- 继承与多态
- media在HTML中作用,web前端:关于css中@media的一些基本使用
- 2022国庆头像制作iAPP安卓源码+附APP成品
- UE4学习之材质系统初探
- 阿里工程师谈,什么是好的代码?
- Java顶级大神的面试经验,竟如此超越常理
- MATLAB调用USB摄像头的过程记录
- 计算机智能方面相关论文,计算机人工智能论文.doc
热门文章
- 理解伪类选择器与伪元素选择器
- 利用python操作word文档
- 《地理信息系统导论》chapter 5 GIS数据获取 习作
- yolov7 网络架构深度解析
- Linux VI文本编辑器
- ubuntu21.04换源
- 服务监控之promethues+grafana,直接送你上大师,这还不上热门吗
- python 利用百度推广API接口,每日调整关键词价格,关键词点击率大于10%的进行降低价格和点击率小于4%进行增加价格
- Java项目版本构建是什么意思_Java项目的构建和版本号(ant,cvs,hudson)
- 【翻译】Rosetta Large Scale System for Text Detection and Recognition in Images