这是我参加8月更文应战的第18天,活动概况检查:8月更文应战

打家劫舍(题号198)

标题

你是一个专业的小偷,方案偷盗沿街的房子。每间房内都藏有必定的现金,影响你偷盗的唯一限制要素就leetcode中文官前端和后端的差异是相邻的房子装有互相连通的防盗系统,假定两间相邻的房子在同一晚上被小偷闯入,系统会主动报警

变量英文定一个代表每个房子寄存金额的非负整数数组,核算你 不触动警报设备的情况下变量是什么意思 ,一夜之内能够偷盗到的最高金额。

示例 1:

输入变量进步:[1,2,3,1]
输出:4
说明:偷盗 1 号房子 (金额 = 1)变量与函数 ,然后偷盗 3 号房子 (金额 = 3)。
偷盗到的最高金额 = 1 + 3 = 4变量min标明什么类型的变量数组指针

示例 2:

输入:[2,7,9,3,1]
输出:12
说明:偷盗 1 号房子 (金额 = 2), 偷盗 3 号房子 (金额 =leetcode题leetcode高频100题库ap数组排序p 9),接着偷盗 5 号房子 (金额 = 1)。
偷盗到的最leetcode题库高金额 = 2 + 9 + 1 =leetcode中文官网 12

提示:

  • 1 <= nums变量min表明什么类型的变量.length <= 100
  • 0 <= num复杂度os[i] <= 400

链接

leetcode-cn.com/prob数组指针lems/ho…

说明

这题啊,这题前端开发需肄业什么是经典DP。

先看看标题,题意简化一下便是:给你一个数组,你不能复杂度o取相邻的元素,求能够取到数字的最大值。

DP的思复杂度比较路就很简略了,搞一个DP数组词数组来记录在每个元素上能够取到的最大值。也便是说dp[i]是在数组转字符串当时位置上的最大数字了。

那怎样求到变量名的命名规则dp[i]呢?dp[i]其实有两种或许:

  • 不取前面一个数字,去前面两位的数字,加上当时的数字,也数组转字符串便是dp[i - 2] + nums[复杂度oi]
  • 取前面一个数字,那天然就不能取当时元素了,也便是d[i - 1]

所以DP公式便是:

dp前端技能[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1])

取二者的最大值即可,DPleetcode会员值得买吗数组的终究一个元素便是在整个数组中能够取到的最大值。

让我们再考虑一下,依据的DP公式,能够发现dp[i]复杂度比较和前两个元素相同,那是不是能够不用数组了,只用两个变量来存储前两位的值,变量类型有哪些每次迭代更新这两数组转字符串量的界说个变数组转字符串量,那么也数组去重方法能够拿到终究的结果。

并且空间复杂度从O(n)干到变量提升O(1)前端开发是干什么的,优化了一复杂度变量些。

自己的答案(DP)

经典DP的操作和说明中说的相变量英文同:

var rob = func复杂度符号tion(nums) {
const dp = new Array(nums.length)
dp[0] =数组指针变量是什么意思 numleetcode每日一题s[0]复杂度
dp[1] = Mleetcode最长回文子串atleetcode中文官网h.max(numleetcode最长回文子串s[0], nums[1])
for (let i =变量英文 2; i < nums.length; i++) {
dp[i] = Math.ma数组去重x(dp[i - 2] + nums[i], dp[i - 1]变量泵)
}
return dp[nums.leng复杂度最优th数组公式 - 1]
}数组指针;

留心这儿的dp[0]dp[1]的初始化leetcode官网赋值,由于dp[i]和前两个数字相关,那么在数组公式初步循环之前,得先有前端训练机构两个初始化的值,否则有或许会取不到前面两位的值。

后续的循环便是不断更新变量min标明什么类数组去重型的变量DP数组的进程,如此取下去,DP数组的终究复杂度符号一个元素便是我们需求回来的值。

自己的答案(DP+降维)

说明中说过,完全能够用两个变量来替代数组复杂度符号

var rob = funct复杂度最高的是ion(nums) {
let before1 = Mathleetcode刷题网站数组的界说.max(nums[0], nums[1]) || Number.MIN_SAFE_Ileetcode官网NTEGER
let before2 =leetcode是什么 nums[0]
for (let i = 2; i < nums.length; i++) {
[before1, before2] = [Math.max(b变量min表明什么类型的变量efore2 + nums[i], before1), before1]
}
return Math复杂度英文.max(before1, before2)
};

这儿用before1替代复杂前端开发需要学什么度比较前一位的变量,用变量名的命名规则端开发需肄业什么before2替代前两位的变量,在循环的进程中也是不断更新before1before2即可。

还有需求留心的当地是before1的赋值,由于假定数组的长度为1,before1取到的值便是NaN了。

为难的当地来了,Math.max(NaN, 0)的值竟然是NaN,你敢信?这样终究的回来值便是NaN了,多为难,所以这儿用Number.MIN_SAFE_IN变量名的命名规则TEGER来标明不存在的before1,用-Infinity也能够,随意。

终究的回来值也得在before1before2中取值,由于数组有变量泵的长度假定是2,并且第二个元素比第一个元素大,那么前端面试题before2便是答案,假定数组的长度为1,那么before1便是复杂度比较答案,所以得取变量之间的联系两种数组的界说中较大的leetcode最长回文子串那个数组排序值。

奇思妙想

其实还发现了一种很幽默的答案:

前端刷题路-Day84:打家劫舍(题号198)

写这个答案的老哥真的太可爱了~

PS:想检查前端技能往期文章变量名的命名规则和标题能够点击下面的链接:

这儿是leetcode题库依照日期分类的

前端刷题路-目录(日期分类)

通过有些朋友的提示,感觉也应该依照题型分类
这儿是依照题型分类的

前端刷题路-目录(题型分类)leetcode是什么