2021/01/29 每日一题 最小体力消耗路径

LeetCode上最小体力消耗路径,思路参考了官方题解,记录下自己的理解过程吧

本月不知道做的,直接先看并查集

这里传入的参数设为[[4,3,4,10,5,5,9,2],[10,8,2,10,9,7,5,6],[5,8,10,10,10,7,4,2],[5,1,3,1,1,3,1,9],[6,4,10,6,10,9,4,6]],接收的是一个二维数组,可以画出如下表格括号内为该点的高度


要从编号0点走到编号39点,求之间消耗的最小体力。根据题意,最小体力的消耗应该是路径上相邻格子之间高度差绝对值最大值决定的,就是连通路径上最高点和最低点的差值。
这里看这张图可以知道,假设每个点只能向右和向下连接,比如0点就可以和1/8点连接,连接的时候需要的体力是1/6,那么可以遍历整张图,生成一个每个点到另外点的一个数组。还要注意最后一行以及最后一列只能向右或者只能向下,这种情况应该过滤掉。

    for(let j=0;j<col;j++) {
      let id = i*col + j
      if(i!== row - 1) {
        nodesmap.push([id,id+col,Math.abs(heights[i][j] - heights[i+1][j])])
      }
      if(j!== col - 1) {
        nodesmap.push([id,id+1,Math.abs(heights[i][j] - heights[i][j+1])])
      }
    }
  }

会写出这样一个双重循环,从[0,0]点开始循环,当前点的编号就是id = i*col + j,每个数组中保存的数据是[当前点序号,连接点序号,两者之间体力消耗的绝对值]
这里需要求得一个最小值,可以理解为一个贪心算法,每次都连接体力消耗最小的,直到两点连接上了,那么此时消耗的体力就是最小体力
根据消耗体力排序nodesmap.sort((a,b) => {return a[2] - b[2]})


那么在最后通过并查集连接的时候从这个数组的第一个开始连接,直到判断到find(nodes[0]) === find(nodes[row*col - 1])即0点和最后一点的parent属性相等就是表示连接了
先连接体力消耗为0的数据

连接体力消耗为1的数据,可以发现此时star已经进入路径了,但是还没有和end连接

这样不断的循环整个数组直到把39连入的时候,那个时候消耗的体力就是最小体力

// 定义一个节点
class node {
   constructor (i) {
     // 将自己的父亲设为自己 
     this.parent = this
     // val属性记录下当前节点在accounts中的位置
     this.val = i
   }
}
// 定义查找函数,不断查找父节点,直到父节点等于本身
const find = function (x) {
   while(x !== x.parent) {
      x = x.parent
   }
   return x 
} 
var minimumEffortPath = function(heights) {
  // 传入的是个二维数组,需要保存行列的数据
  // 有多少行
  let row = heights.length
  // 有多少列
  let col = heights[0].length
  // 结果
  console.log(row*col);
  let res = 0
  // 创建对应多个节点数组
  let nodes = Array(row*col).fill(0).map((x,i) => new node(i))
  // 改造二维数组
  // map 用于存放改造后的数组
  let nodesmap = []
  // 填充这个map,每个子数组对应的是[当前点,下一个点,两个点之间的]
  for(let i =0;i<row;i++) {
    for(let j=0;j<col;j++) {
      // 每个点可以往下和往右走
      // 那么最右和最下排的点只能往下和往右,只有一个方向,那么对应的就是j=col-1列以及i=row-1行
      // 除去这两排其他点都要记录和向下以及向右的点的距离
      // 对应的当前点在nodes数组中的id
      let id = i*col + j
      if(i!== row - 1) {
        // 当前节点向下连接,即在同一行上
        // 当前节点和下一行同位置的节点连接
        nodesmap.push([id,id+col,Math.abs(heights[i][j] - heights[i+1][j])])
      }
      if(j!== col - 1) {
        // 当前节点向右连接,即在同一列上
        // 当前节点和下一列同行连接
        nodesmap.push([id,id+1,Math.abs(heights[i][j] - heights[i][j+1])])
      }
    }
  }
  // 为了计算更短的体力消耗,就要根据map内子数组的第3位从小到大排序
  nodesmap.sort((a,b) => {return a[2] - b[2]})
  // 那么nodesmap就是根据体力从小到大排序的,之后一个个相连,知道左上和右下点的parent属性相等的时候
  // 那么就是两点相连了
  console.log(nodesmap);
  for(let i = 0;i<nodesmap.length; i++) {
    let [x,y,l] = nodesmap[i]
    res = l
    // 连接xy点
    find(nodes[y]).parent = find(nodes[x])
    if(find(nodes[0]) === find(nodes[row*col - 1])) {
      // 如果左上和右下的parent相等,那么就是连通了
      break
    }
  }
  return res
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容