Day 20

第174题:

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快到达公主,骑士决定每次只向右或向下移动一步。

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。来源:力扣(LeetCode)

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。

-2 (K) -3 3
-5      -10 1
10      30 -5 (P)

1、在二维数组中我们需要知道最左上角骑士能到达最右下角的保持血量为正的最低血量;

  就必须从最右下角开始分别求出每个方格内的骑士到达这个方格所需的最低血量,例如最后一个方格为-5,那么骑士走完上一个方格后必须拥有6滴血的意思;

  所以我们需要求出每个方格骑士到达的时候所持有的最低血量;

  按照骑士只能向下或者向右移动的规则,那么可以得出骑士到达dp[i][i]这个方格的最低血量取决于dp[i+1][j]和dp[i][j+1]的最小值(因为在二维数组内数字为-,所以去max);

  首先我们可以将最右下角的方格值得到,如果它为正数,则设为0;不是的话就不变了;

  得出了dp[i][j]的值,那我们就可以将它的上面和左边的方格的所允许的值求出来;

  只有求到dp[i-1][j]和dp[i][j-1],才可以求出dp[i-1][j-1]的值,这样就可以得出所有方格所需的最低血量,也就得出结果dp[0][0]了;

  最终返回结果,为负则变为正数+1,为正则变0;

  

第27题:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)

1、双指针法,i和j都指向数组开头,当 j 指向的值不为val时,i++,j++,且将nums[j]的值赋给nums[i](便于将后面的值转移到前面)

  j 指向的值为val时,就将j++;

  直到j指向的值=val时,将nums[j]和nums[i]交换;

  一直结束输出i,此时i为删除了所有值为val的数组长度。

  

第24题:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。(来自LeetCode)

1、递归

  

2、迭代

  

原文地址:https://www.cnblogs.com/liang-yi-/p/13291232.html