ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

力扣198打家劫舍补充(滚动数组)

力扣198打家劫舍补充(滚动数组)

补充力扣198打家劫舍(动态规划)-CSDN博客的滚动数组写法,只有小改动

原未使用滚动数组代码:

class Solution { public int rob(int[] nums) { int length = nums.length; if(nums == null || length == 0){ return 0; } if(length == 1){return nums[0];} int[] dp = new int[length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); for (int i = 2; i < length; i++){ dp[i] = Math.max(dp[i - 2] + nums[i] , dp[i-1]); } return dp[length - 1]; } }

使用了数组存储结果。

考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额。

即:只用两个变量滚动保存前两状态代替dp数组

看代码:

class Solution { public int rob(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int length = nums.length; if (length == 1) { return nums[0]; } //区别从这里开始 int first = nums[0], second = Math.max(nums[0], nums[1]); for (int i = 2; i < length; i++) { int temp = second; second = Math.max(first + nums[i], second); first = temp; } return second; } }

[ first , second , nums[i] ]滑动数组大致长这样

first:到 i-2 位置能偷到的最大金额

second:到 i-2 位置能偷到的最大金额

temp:先存旧second值(也可以说是nums[i-1]的值)后面赋值给first
为什么要赋值给first ? 很好理解:
数组向后滑动一位,则first即为上一次second的值
同理:second是上一位nums[i]的值
新的nums[i](其实是上一轮的num[i+1]了)

仿照第一轮:把temp赋值为现在数组的second,接着重复就行了
每一轮只看数字增加的值其实只有second(只看数字,不说谁取谁的值)
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进