大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟。
欢迎小伙伴们加我微信:
sudongyuer
拉你进群,一起讨论,期待与大家共同成长🥂。
前言🌧️
算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。
因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。
当然,学习也是有侧重点的,作为前端我们不需要像后端开发一样对算法全盘掌握,有些比较偏、不实用的类型和解法,只要稍做了解即可。
题目🦀
难度中等
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例 1:
输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:
输入:[2,7,9,3,1] 输出:12 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 400
解题思路🌵
- f(k)=从前k个房屋中能偷窃到的最大数额。
- Ak=第k个房屋的钱数。
- f(k)=max(f(k-2)+Ak,f(k-1))。
- 比如输入:[1,2,3,4]
输出:4
解题步骤🐂
- 定义子问题:f(k)=max(f(k-2)+Ak,f(k-1))。
- 反复执行:从2循环到n,执行上述公式。
- 源码🔥
空间复杂度为O(n):
/** * @param {number[]} nums * @return {number} */ var rob = function(nums) { if(nums.length<=0){return 0;} const dp0=0, const dp1=nums[0]; for(let i=2;i<=nums.length;i++){ dp[i]=Math.max(dp0+nums[i-1],dp1) dp0=dp1; dp1=dp[i] } return dp[nums.length] };
- 空间复杂度为O(1)
- 优化:
var rob = function(nums) { if(nums.length<=0){return 0;} let dp0=0; let dp1=nums[0]; let dp2=dp1; for(let i=2;i<=nums.length;i++){ dp2=Math.max(dp0+nums[i-1],dp1) dp0=dp1; dp1=dp2 } return dp2 };
- 时间复杂度:O(n)
结束语🌞
那么鱼鱼的LeetCode算法篇的「LeetCode」198-打家劫舍⚡️
就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾
,欢迎加我好友
,一起沙雕
,一起进步
。